Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

323

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Советник

278

Россия, Санкт-Петербург


ID: 400669

epimkin

Профессионал

254


ID: 137394

Megaloman

Мастер-Эксперт

122

Беларусь, Гомель


ID: 405239

al4293189

1-й класс

92


ID: 325460

CradleA

Мастер-Эксперт

76

Беларусь, Минск


ID: 226425

Konstantin Shvetski

Модератор

49

Россия, Северодвинск


8.9.8

01.08.2021

JS: 2.9.16
CSS: 4.5.14
jQuery: 3.6.0
DataForLocalStorage: 2021-08-02 12:16:01-standard


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

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

Консультация онлайн # 146220

Раздел: Assembler
Автор вопроса: Alexeyk
Дата: 06.10.2008, 18:19 Консультация закрыта
Поступило ответов: 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


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

Ответов пока не поступило

Мини-форум консультации # 146220
Boriss

1

= общий =    06.10.2008, 19:54

Почему же у Калашникова нет? Просто невнимательно прочитали, как работает iret , и чем отличается от ret .

неизвестный

2

= общий =    06.10.2008, 22:46

Точно! Сейчас почитал рассылку (именно рассылку), где всё подробно описано): smile

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


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

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

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

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 119

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 8

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0

Kdsfofwe21

2-й класс

Рейтинг: 0