Консультация № 146220
06.10.2008, 18:19
0.00 руб.
0 2 0
Доброго времени суток!
У меня вопрос по поводу работы перехватчика прерывания. Конкретно, о работе инструкции pushf.
Если её убрать, то программа по iret выйдет вобще нипонятно куда (где одни нули), но с этой инструкцией всё проходит нормально)
Объясните, плиз, почему, если мы не сохраним флаги, происходит такая лажа (кстати мы их не восстанавливаем, т.е. нет инструкции popf)

Пример набран по книге Калашникова, но там объяснения я так и не нашёл (если оно там есть, подскажите где)...

Код (FASM):

Код:
 
org 100h

go:
jmp init

myint21:
cmp ah, 9h
je good
jmp dword ptr cs:my_int_vect
good:
push dx
push ds

push cs
pop ds

pushf

mov dx, my_string
call dword ptr cs:my_int_vect
pop dx
pop ds
iret

my_int_vect dd ?
my_string db 'Replaced string$',0

init:
mov ah, 35h
mov al, 21h
int 21h
mov word ptr my_int_vect, bx
mov word ptr my_int_vect+2, es
mov ax, 2521h
mov dx, myint21
int 21h
mov dx, init
int 27h


Зарание большое спасибо)

Обсуждение

Неизвестный
06.10.2008, 19:54
общий
Почему же у Калашникова нет? Просто невнимательно прочитали, как работает iret , и чем отличается от ret .
Неизвестный
06.10.2008, 22:46
общий
Точно! Сейчас почитал рассылку (именно рассылку), где всё подробно описано):

Теперь ответ на вопрос: почему перед вызовом прерывания командой вида call dword ptr cs:Int_21h_vect] мы заносим в стек регистр флагов командой pushf?
Все просто. Стоит только посмотреть на отличие оператора RETF от IRET (см. выше). При передаче управления (вызове) прерывания командой call dowrd ptr... процессор заносит в стек только сегмент (CS) и смещение (IP) следующей за командой call инструкции. А IRET (который выполняется при возврате из прерываний) достанет со стека сегмент:смещение и флаги. Но флаги-то не заносятся командой call dword ptr...! Мы их заносим сами, "вручную". Иначе произойдет нарушение работы стека, и компьютер "зависнет". Как я уже говорил, за стеком нужно следить очень внимательно!


в дальнейшем буду больше расчитывать на рассылку, нежели на книгу)
тема закрыта)
Форма ответа