当前位置: 代码迷 >> 汇编语言 >> 关于debug下调试程序的疑问,该怎么解决
  详细解决方案

关于debug下调试程序的疑问,该怎么解决

热度:10095   发布时间:2013-02-26 00:00:00.0
关于debug下调试程序的疑问
在下最近在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....
  相关解决方案