перехват int 21h

Тема в разделе "WASM.BEGINNERS", создана пользователем INsect, 22 июл 2005.

Статус темы:
Закрыта.
  1. INsect

    INsect New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    2
    Есть код:

    CSEG segment

    assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

    org 100h

    Start:

    jmp Init

    ;-----------------------------------------------;

    ; Обработчик прерывания ;

    ; int 21h (резидентная часть) ;

    ;-----------------------------------------------;

    Int_21h_proc proc

    pushf

    cmp ah,9

    je Ok_09

    popf

    jmp dword ptr cs:[Int_21h_vect]

    Ok_09:

    push ds

    push dx

    push cs

    pop ds

    mov dx,offset My_string

    pushf

    call dword ptr cs:[Int_21h_vect]

    pop dx

    pop ds

    popf

    iret

    Int_21h_vect dd ?

    My_string db 'Перехват$'

    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



    Перехватывает 21 прерывание, в частночти при вызове функции 09H выводит заданную строку. Все понятно. Кроме

    пушей и попов.

    В частности: место

    push ds

    push dx

    push cs

    pop ds

    mov dx,offset My_string

    pushf

    call dword ptr cs:[Int_21h_vect]

    pop dx

    pop ds

    popf

    ведь вынимаем то мы не в том порядке, в котором мы ставили в стек.

    В общем, пожалуйста, поясните про вс пуши и попы.

    Еще.

    Если запустить все это в AFD, то после вызова int 21 прога переходит, как я понимаю, на адрес обработчика этого прерывания, обрабатывает его, и так далее по коду, но после того, как завершит выполняться нерезидентная часть, по вызову int 27h происходит переход на обработчик и после этого начинаются "блуждания" по каким-то сумашедшим адресам и не выполняется код в резидентной части. По сему то я и не смог посмотреть и разобраться с первой частью моего вопроса. Хотя она работает как и должна.

    Спасибо за внимание. Буду признателен помощи.
     
  2. INsect

    INsect New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    2
    Все понял. спасибо.

    Можно закрывать
     
Статус темы:
Закрыта.