我有一个非常基本的TSR代码。它所做的是,当我键入"D“键时,它将在屏幕上打印"E”,没有其他内容。
我想做的是:当我按下"ESC“按钮,我想删除我的TSR并返回到原来的BIOS例程。
org 100h
equ 060h
EOI equ 020h
Master_8259 equ 020h
main:
call _inst_09
_inst_09:
cli
xor ax, ax
mov es, ax
mov bx, [es:09h*4]
mov [stari_int09_off], bx
mov bx, [es:09h*4+2]
mov [stari_int09_seg], bx
mov dx, tastatura
mov [es:09h*4], dx
mov ax, cs
mov [es:09h*4+2], ax
sti
mov ax,3100h
mov dx,500
int 21h
ret
tastatura:
push ax
in al, KBD ; Ucitati scan_code iz I/O registra tastature
mov [kbdata], al
cmp byte[kbdata],20h
je .lup
mov al, EOI ; Kod za End Of Interrupt (EOI)
out Master_8259, al ; Poslati EOI na Master PIC (dozvola novih prekida)
pop ax
iret
.lup:
mov al,45h
mov ah,0eh
int 10h
mov al, EOI
out Master_8259, al
pop ax
iret
stari_int09_seg: dw 0
stari_int09_off: dw 0
kbdata: db 0
%include "ekran.asm"我知道我需要卸载我修改过的interupt,但是我的程序在我这样做之后就变得响应起来了。
这将是取消身份的过程。
_uninst_09:
cli
xor ax, ax
mov es, ax
mov ax, [stari_int09_seg]
mov [es:09h*4+2], ax
mov dx, [stari_int09_off]
mov [es:09h*4], dx
sti
ret诀窍是我不知道该把它放哪儿。我试着检查ESC是否被按下,然后跳到这个过程,但它似乎不起作用。
发布于 2014-11-01 15:39:33
将所有连接中断向量恢复到它们的原始值,关闭所有文件(如果有的话),释放从DOS分配的所有动态内存(如果有的话),然后释放程序区域本身。根据TSR是COM文件还是EXE文件,其起始地址将有所不同。对于COM文件,程序内存从文件开始开始;对于EXE文件,则稍微复杂一些。然后像往常一样从中断处理程序返回,它将不再被调用。
要释放DOS内存,请使用中断21h,函数49h。
编辑:您的问题在于您的中断处理程序。它没有正确地处理键盘输入,从而破坏了前台进程的键盘。
在处理程序中,首先调用原始的第一件事情(因为它是一个中断处理程序):
tastatura:
push es
push ax
mov ax, [stari_int09_seg]
mov es, ax
mov ax, [stari_int09_off]
pushf
call es:ax然后使用int 16读取键盘输入。
https://stackoverflow.com/questions/26690771
复制相似问题