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。
- debug中-t的使用
- DEBUG中T命令的堆栈变化
- MyEclipse中debug的使用
- Studio 中 debug的使用
- Eclipse 中 debug 的使用心得
- android中BuildConfig.DEBUG的使用
- Android开发中BuildConfig.DEBUG的使用
- android中BuildConfig.DEBUG的使用
- debug中E命令的使用
- android中BuildConfig.DEBUG的使用
- android中BuildConfig.DEBUG的使用
- Eclipse中Debug模式的使用
- VS2015中#if DEBUG的使用(C#)
- JAVA开发中DEBUG的使用
- eclipse中debug模式的使用
- debug--T
- Debug视图 debug的使用
- C#中IComparable<T>和IComparer<T>接口的使用
- 描述符属性
- c#.net 清空页面TextBox
- 描述符属性
- 保护模式下段基址和段界限在描述符中分开存放的原因
- A20地址线
- debug中-t的使用
- 01数据库设计
- 数据对齐的作用(于ALIGN密切相关)
- sourcegrid 应用实例(全部来自官网下载的例子)
- NASM与MASM的区别(不断更新中,参考NASM中文手册)
- 临界表达式
- 低落的我
- BSS段
- linux shell awk获得外部变量(变量传值)