注册 登录
编程论坛 汇编论坛

汇编中的中断为啥刹不住了?

乾坤洞主 发布于 2013-01-24 17:56, 517 次点击
为什么在debug下t命令管不住
mov ss,ax
mov sp,16
这两步一个t直接就过去了!
5 回复
#2
zklhp2013-01-24 18:00
debug在处理堆栈的时候经常有一些奇怪的问题 原因很简单 DOS是单进程的 所以debug和被调试的程序用的是同一个堆栈 因而会有很多稀奇古怪的事 习惯就好了
#3
清微御宇2013-01-24 18:22
回复 2楼 zklhp
#4
x64asm2013-01-25 00:34
因为MOV SS,段寄存器的操作是原子操作.

堆栈指针是由SS段寄存器和SP组成的,所以修改堆栈的操作需要两条指令,即:

MOV SS,堆栈段指针
MOV SP,堆栈指针

在早期的8086处理器,这两条指令不是原子操作,因此,如果修改SS后发生中断
那么,中断处理程序将得到错误的堆栈,造成系统崩溃,后来INTEL修正了指令系统
在执行 MOV SS,堆栈段指针 以后,自动隐含关闭中断,直到下条指令执行完毕以后,
才会开放中断,实现了修改堆栈的原子操作.

所以,跟在MOV SS,堆栈段指针后的指令,将无法打断,因此不能单步执行.
#5
hu9jj2013-01-25 11:10
解释的很详细,赞!
#6
清微御宇2013-01-25 12:10
DEBUG下的T命令是通过设置标志寄存器的TF=1,让cpu执行完这条语句后,引发单步中断的,中断的过程会伴随FR,CS,IP的入栈操作!
1