Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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


В избранное