在下最近在cmd下debug中调试程序的时候发生了这样的问题:
拿下面的程序来说
这个程序时王爽《汇编语言》第二版的实验15
功能就是装入新的 int9例程
使得,再按下A键并松开后,显示满窗口的'A'
调试完成之后
我按下了A键并松开,显示了满窗口的'A'
但与此同时,
再按键盘的时候就没用了
窗口中能看到光标一闪一闪了
但是键盘也不能输入了
一直都是满窗口的'A'
想用q命令退出debug也不行
只得把cmd窗口关了,重新运行cmd
请问这是怎么回事?
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
w:
push cs
pop ds
mov si,offset int9
mov ax,0
mov es,ax
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb ;将新的中断例程写入0:204h
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;原int9中断例程地址存入0:200中
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti ;int9 中断例程地址指向0:204
mov ax,4c00h
int 21h
int9:
push ax
push bx
push cx
push es
in al,60h
cmp al,9eh
jne ok
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,4000
s: mov byte ptr es:[bx],'A'
add bx,2
loop s
jmp short int9ret
ok:
pushf
call dword ptr cs:[200h] ;调用中断程序后,cs为0
int9ret: pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end w
------解决方案--------------------------------------------------------
debug由于自身所在V8086的原因,在调试一些和单步中断,读写显存时
会出现一些问题。解决办法是,使用一些带有调试功能的虚拟机或者
使用一定调试技巧进行调试。
------解决方案--------------------------------------------------------
一,把新INT 9里一进去就要将IF和TF位置0,否则进新INT 9后还可以响应键盘中断,在按下键盘后可能你没那么反映敏捷,只保证只INT 9只响应一下,那就可能造成嵌套,如果在进INT 9后的那几个PUSH后再响应问题就出来了.
二,无论按下的是不是a键,都要让原INT 9执行一下,虽然我不知道原INT 9具体怎么在操作,但保险系数会高点...
三,loop 2000次就够了...25*80....