Bobadd
Гость
|
|
« : 19-12-2005 01:23 » |
|
в общем дело обстоит так. Пишу курсач по асму, суть заключается в том, чтобы при работе флопа выводился какой-либо индикатор. Я сделал перехват 13-го прерывания, с грехом пополам за часов 10 написал чтоб эта грешная лампочка моргала, в общем дошло дело до того, как из этого резидента выходить (естественно подчищая за собой). В курсаче необходимо чтобы выходила по нажатию ctrl+u. Я перехватываю 9-е прерывание и делаю следующую вещь: new09h proc far pushf push ax push bx push cx push dx push si push di push bp push ds push es in al, 60h cmp al,1Dh jne not_ctrl mov ifctrl,1 jmp endd not_ctrl: cmp al,16h jne no_u cmp ifctrl,1 jne no_u mov ax,0FFFFh pushf call cs:[new2fh] mov ah,0Ch mov al,9 ;выбиpaeм левую ф-ию int 21h ;чиcтим буфep mov ah,5 mov cl,13 int 16h ; Здесь в обработчике вызывается ещё и int 09h cli in al, 61h or al, 80h out 61h, al and al, 7fh out 61h, al mov al, 20h ; EOI out 20h, al sti pop es ;восстанавливаем регистры pop ds pop bp pop di pop si pop dx pop cx pop bx pop ax popf jmp endpp no_u: mov ifctrl,0
endd: pop es ;восстанавливаем регистры pop ds pop bp pop di pop si pop dx pop cx pop bx pop ax
popf jmp cs:[old09h] endpp:
iret new09h endp
Функция 2fh - это мультиплексное прерывание, я использую именно для вычищения оперативки: new2fh proc far
cmp ax,3210h je proverka
cmp ax,0FFFFh jne go_to_old
pusha push es push ds
push cs pop ds mov ah,9h mov dx,offset EndProg int 21h
RESTOREVECTOR 13h RESTOREVECTOR 09h ;;портить будет только ds и ax RESTOREVECTOR 2Fh
mov es, cs:2ch ; Unload PSP Environment mov ah, 49h int 21h
mov ax, cs ;; Delete our resident, free memory mov es, ax ;; es - segment PSP mov ah, 49h int 21h ;; Delete
pop ds pop es popa
proverka: mov ax,0123h ;; Priznak jmp outp
go_to_old:
pushf call cs:old2Fh outp: iret new2Fh endp
Так вот теперь о проблемах. В общем по возвращению из int 2fh прога попадает на iret (в функции 09h) и... виснет... Как только не перепробовал, ничего не помогает, всее попробовал. Если вам нетрудно, подскажите чайнику! Если надо могу вывесить весь код программы. З.Ы. Есть такая прогулина DOSBOX (Эмулятор доса под винду) - так вот в ней всё прекрасно работает и даже вычищает нормально З.Ы.Ы. Под досом 6.22 выход не работает! Заранее спасибо. Bobadd
|