WMmail.ru - сервис почтовых рассылок

среда, 20 октября 2021 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

  
Сбросим вместе размер за неделю
  
  
  
Subscribe.ru
RFpro.ru: Ассемблер? Это просто! Учимся программировать

РАССЫЛКИ ПОРТАЛА RFPRO.RU

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

Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
• повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
• повысить рейтинг »
cain52
Статус: 3-й класс
Рейтинг: 0
• повысить рейтинг »

Assembler

Номер выпуска:1795
Дата выхода:20.10.2021, 22:45
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:7 / 25
Вопросов / ответов:1 / 1

Консультация # 201516: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Не могу разобраться как работает резидентная программа по книге Калашникова, помогите пожалуйста smile
Код
 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 

Остальное же мне вроде все понятно, Огромное спасибо вам smile

Дата отправки: 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 - Обработчик из Вашего вопроса.

Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 20.10.2021, 10:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
Если выпуск не отображается, вы можете прочесть его на сайте

Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru.
Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.

Вы можете отказаться от получения писем.

Архив рассылки Поддержка подписчиков

Это сообщение сформировано и выслано с помощью Sendsay.Ru

Комментариев нет:

Отправить комментарий