РАССЫЛКИ ПОРТАЛА RFPRO.RU
Лучшие эксперты в разделе
Номер выпуска: 1795 Дата выхода: 20.10.2021, 22:45 Администратор рассылки: Зенченко Константин Николаевич (Старший модератор) Подписчиков / экспертов: 7 / 25 Вопросов / ответов: 1 / 1
Консультация # 201516 : Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Не могу разобраться как работает резидентная программа по книге Калашникова, помогите пожалуйста Консультация # 201516 :
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Не могу разобраться как работает резидентная программа по книге Калашникова, помогите пожалуйста
Код
CSEG segment assume cs:CSEG,es:CSEG,ds:CSEG,ss:CSEG org 100h Start: jmp Init Int_21h_proc proc cmp ah,9 je Ok_09 jmp dword ptr cs:[Int_21h_vect] Ok_09: push ds push dx push cs pop ds mov dx,offset My_stirng pushf call dword ptr cs:[Int_21h_vect] pop dx pop ds iret Int_21h_vect dd ? My_stirng db 'Moya stroka!$' Int_21h_proc endp Init: mov ah,35h mov al,21h int 21h mov word ptr Int_21h_vect,bx mov word ptr Int_21h_vect+2,es mov ax,2521h mov dx,offset Int_21h_proc int 21h mov dx,offset Init int 27h CSEG ends end Start И так, как я понимаю: 1. Получаем адрес оригинального прерывания и сохраняем его сегмент и смещение в переменную Int_21h_vect 2. Загружаем адрес нашего обработчика, вместо оригинального. То есть мы не изменяем адрес как таковой оригинального обработчика, а изменяем адрес указывающий на него в таблице векторов. Таблица векторов это номера прерываний, указывающие где находиться это прерывание в памяти. Далее мне не понятно следующее: 1. Код
jmp dword ptr cs:[Int_21h_vect] Я понимаю зачем в одном случае мы используем jmp, а в другом call. Так как в одном случае нам нужно просто отдать работу оригинального обработчика, а в другом вернуться, чтобы восстановить регистры. Я не понимаю, что значит cs:[Int_21h_v ect]. в Переменной и так храниться сегмент и смещение, зачем нам ещё раз указывать сегмент cs, который указывает на сегмент кода резидентной программы. Как вообще происходит прыжок если по сути указывается 2 сегмента и смещение. 2. Код
push cs pop ds mov dx,offset My_stirng Когда мы находимся в контрольной программе для проверки работы обработчика, при его вызове мы переходим на сегмент кода обработчика, остальные же сегментные регистры не изменяются и чтобы подменить исходную строку на нашу, мы подменяет сегмент данных контрольной программы, на сегмент кода резидентной для того чтобы подменить адрес исходной строки на нашу ( то что все сегменты находятся на одном адресе у com программ я помню). Мне не понятно зачем сохранять а затем восстанавливать после работа оригинального прерывания в стеке другие регистры, если они не изменяются. Код
push ds push dx pop dx pop ds Остальное же мне вроде все понятно, Огромное спасибо вам Дата отправки: 15.10.2021, 22:37 Вопрос задал: kolyatimushev (Посетитель) Всего ответов: 1 Страница онлайн-консультации »
Консультирует Зенченко Константин Николаевич (Старший модератор):
Доброе время суток!
Только я все равно не понимаю, что значит квадратные скобки и как их можно использовать.
Это косвенная адресация. А значит - будет прочитано значение по адресу cs:Int_21h_vect и оно попадет CS : IP, т.е. будет сделан переход. Код [Assembler]
jmp dword ptr cs:Int_21h_vect В синтаксисе MASM и TASM режиме совместимости с MASM(по умолчанию), это практически одно и тоже. Но если использовать другой компилятор FASM(к примеру) или TASM перевести в IDEAL, такой фокус уже не пройдет. Код [Assembler]
jmp dword ptr cs:Int_21h_vect = адрес jmp dword ptr cs:[Int_21h_vect] = значенние по этому адресу Мне не понятно зачем сохранять а затем восстанавливать после работа оригинального прерывания в стеке другие регистры, если они не изменяются.
При срабатывании любого обработчика достоверно известны только CS : IP, остальное принадлежит прерваной программе. Поэтому, чтобы не нарушить ее работу, используемые регистры нужно сохранять и востановливать. Этот код нужно расматривать вместе с контрольной программой. Пример работы 211018t = контрольная программа Код [Assembler]
CSEG segment assume cs:CSEG,es:CSEG,ds:CSEG,ss:CSEG org 100h Start: mov ah,9 lea dx,dbHello int 21h ret dbHello db 10,13,' Hello kolyatimushev:$' CSEG ends end Start 211018 - Обработчик из Вашего вопроса. Удачи! Оценить выпуск | Задать вопрос экспертам
главная страница | стать участником | получить консультацию техническая поддержка
Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его . Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум , почитав журнал , который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом . Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС!
Комментариев нет:
Отправить комментарий