Есть код: 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 происходит переход на обработчик и после этого начинаются "блуждания" по каким-то сумашедшим адресам и не выполняется код в резидентной части. По сему то я и не смог посмотреть и разобраться с первой частью моего вопроса. Хотя она работает как и должна. Спасибо за внимание. Буду признателен помощи.