debug中-t的使用

来源:互联网 发布:手机号加密存储数据库 编辑:程序博客网 时间:2024/04/29 02:27


对于如下代码,在命令提示符下用-t debug发现执行mov [bx],ax(即标号为b的下一行时),-t指令就会失效,是程序直接结束
经验证发现,程序正常结束(program terminated normally),而且查看data段发现结果正确。但为什么-t会失效一直不明白。
在CSDN上咨询了其他人之后,关键是自己再做了多次实验之后,哈哈终于得到症结所在。

执行-t命令的是
assume cs:code,ds:data,ss:stack
  data segment
  dw 0011h,1122h,2233h,3344h,4455h,5566h,6677h,7788h
  data ends
  
  stack segment
  dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  stack ends

  code segment
  start: mov ax,data
  mov ds,ax

  mov ax,stack
  mov ss,ax
  mov sp,32

  mov bx,0
  mov cx,8
  a:mov ah,ds:[bx]
  add bx,1
  mov al,ds:[bx]
  push ax
  add bx,1
  loop a

  mov bx,0
  mov cx,8
  b:pop ax
  mov [bx],ax
  add bx,2
  loop b

  mov ax,4c00h
  int 21h
  code ends
end start


首先抛开这段代码,我们知道在执行-t指令时,CPU自动产生类型号为1的中断,即单步中断,CPU将标志寄存器,CS,IP依次压入SS:SP指向的栈中,因此要占用3个字长度的空间。每次一条语句执行完毕,便会将这些现场的值压入栈中,因此栈空间一旦不能满足存储的大小,就会不执行单步中断.


/**********************************************************我是分隔符**********************************************************************************************/

这里的一位网友的回答给出了一个比较满意的答案
你的错误在于堆栈设置的太小,sp=4时,如果发生硬件中断(如每秒18.2次的时钟中断),会导致堆栈空间不够用,sp跨段,中断处理程序中的iret指令没法返回正确的地址,也就是跑飞了,运行到一个存在非法指令的地址上去了,所以才会有你看到的结果。

感谢汤旺河边朋友,他说只有sp=4时才出现错误,sp=0,sp=2的情况不出现错误,试验一下确实如此。
硬件中断产生时,需要压入堆栈内6个字节。
调用中断的命令int x
相当于下面这四句:
pushf
push cs
push ip
jmp XXXX:XXXX  ;xxx:xxxx是从中断向量表中查出的地址。
只有在sp=4时导致压入的cs和ip不在一起,无法正确返回。
如果让sp=3,在我的机器上,会让debug直接退出,并不会出现错误。

结论,避免出现这种错误的方法就是让sp足够大,绝对不能小于6。

原创粉丝点击