18.01.2020, 07:36 [+3 UTC]
в нашей команде: 4 150 чел. | участники онлайн: 4 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.80 (15.01.2020)
JS-v.1.35 | CSS-v.3.36

Общие новости:
06.01.2020, 22:45

Форум:
13.01.2020, 16:40

Последний вопрос:
18.01.2020, 02:32
Всего: 151434

Последний ответ:
17.01.2020, 19:30
Всего: 259652

Последняя рассылка:
18.01.2020, 05:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
02.03.2011, 12:55 »
ANATOLY FIRST
Спасибо. Все работает. [вопрос № 182356, ответ № 266062]
21.07.2019, 11:39 »
dar777
Это самое лучшее решение! [вопрос № 195983, ответ № 278413]
16.10.2009, 14:45 »
PsySex
Спасибо!!! Теперь все понятно. [вопрос № 173271, ответ № 255415]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 972
solowey
Статус: Специалист
Рейтинг: 273
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 269

Перейти к консультации №:
 

Консультация онлайн # 144969
Раздел: • Assembler
Автор вопроса: Sergik1977
Отправлена: 25.09.2008, 09:43
Поступило ответов: 1

Уважаемые эксперты помогите решить следующую задачу. Нужно сделать резидент который бы перехватывал бы ДОС прерывание «вывод строки на экран» и копировал эту строку в файл. Я тут начал это делать но столкнулся с проблемой я не могу использовать прерывания в резиденте так как сам их перехватываю. И не уверен что
правильно определил по какому адресу находится строка. Пожалуйста доведите мою программу до ума.

Приложение:

Состояние: Консультация закрыта

Здравствуйте, Sergik1977!

Программа в приложении.
Адрес строки у Вас уже есть в паре регистров DS:DX.
Неизвестно только длина строки, которая ограничена символом '$'.
Именно поэтому копирование в строки в буфер лишнее, т.к. она может быть очень большой, а это может привести к сбою в работе Вашего резидента.
Удачи!

Приложение:


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 25.09.2008, 12:49

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 144969
неизвестный

# 1

= общий = | 25.09.2008, 13:29

Спасибо огромное Константин Николаевич программа работает как задумано. Извините за назойливость, но я не понял пару моментов. Это касается инициализации переменных. Почему эти строчки стоят
до процедуры «new21»
My_string db 'c:\123.txt',0
Handle dw ?
А эти в теле процедуры:
db 0eah
old21h_o dw ?
old21h_s dw ?
И мне непонятно назначение вот этого байта без имени «db 0eah»
И непонятно зачем мы сохраняем флаги
pushf
call dword ptr cs:[old21h_o]
но не восстанавливаем их потом?
Конечно я могу обшарить кучу справочников и найти ответы на эти вопросы,
Но у меня маленький сын на руках и не дает мне достаточного времени.

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 2

= общий = | 25.09.2008, 13:53 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Строки с указанием имени файла и указатель на открытый файл являются даными и должны находится вне исполняемого кода.

Загадочное db 0eah , это опкод команды jmp far сегмент:смещение являются не данными, а кодом.
Такой подход позволяет экономить 4-е байта на хранении адреса старого обработчика, нужных для резидентных программ.

Возврат из прерывания происходит командой IRET , которая помимо сегмента и смещения востанавливает ещё и регистр флага, а команда Сall записывает только сегмент и смещение. Если не сохранять регистр флагов, то нарушается стек и как следствие нормальная работа программ.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

неизвестный

# 3

= общий = | 25.09.2008, 15:01

Поражаюсь как люди пишут красиво программу. Я как напишу так там одни переходы через всю программу. Ну на последних два вопроса Константин Николаевич. Почему открывали файл и записывали в сегменте перехваченной программы а закрыли файл в своем сегменте? Или это просто так получилось? И я так и не понял почему вот эти данные old21h_o dw ?
old21h_s dw ? нельзя вынести из тела процедуры. Я попытплся это сделать резидент перестал работать)))

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 4

= общий = | 25.09.2008, 15:32 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Чтобы вынести эти строки за пределы резидента Вам нужно изменить так часть программы:

jmp   setup; Перейдем к программе исталляции
; Резидетя часть прогрммы  начитается здесь
My_string	db	'c:\123.txt',0; файл для записии
Handle		dw	?;handl файла
old21h_o	dw	?
old21h_s	dw	?
new21	PROC	FAR           
		cmp	ah,9;Проверим: это фукция 09h?
		je	Ok_09;Если т к, то   метку Ok_09
		jmp	dword ptr cs:[old21h_o]
;обработчик


Файл открывали в сегменте резидента:
;переходим в свой сегмент данных
		push	cs
		pop	ds

В сегменте программы только записывали в файл. Адреса имени файла и блока записи(чтения) адресуются по умолчанию DS:DX.
B принципе сегментным регистром можно было и не игратся только в нужных местах постоянно добавлять сегмент кода CS:.
Мне кажется так код проще смотрится.

Пройдет время и Вы будете также писать, я тоже коряво начинал. smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

неизвестный

# 5

= общий = | 25.09.2008, 16:11

Еще раз спасибо. Все стало понятно.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15005 сек.

© 2001-2020, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.80 от 15.01.2020
Версия JS: 1.35 | Версия CSS: 3.36