内中断04 – 零基础入门学习汇编语言63
第十二章:内中断04
让编程改变世界
Change the world by program
单步中断
什么是单步中断?
CPU为什么要提供这样的功能呢?
我们在使用Debug的T命令的时候,有没有想过这样的问题,Debug如何能让CPU在执行一条指令后,就显示各个寄存器的状态?
假想:如果CPU不提供其他功能的话,就按正常方式工作,只要CPU一加电,它就从预设的地址开始一直执行下去……不可控制!
可是,我们在Debug中看到的情况却是,Debug可以控制CPU执行被加载程序中的一条指令,然后让它停下来,显示寄存器的状态。
Debug有特殊的能力吗?
我们只能说Debug利用了CPU提供的一种功能。
只有CPU提供了在执行一条指令后就转去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的这种功能做出我们使用T命令时的效果。
好了,我们先来谈谈CPU是如何实现单步中断机制,然后再来简要地考虑一下Debug是如何利用CPU所提供的单步中断的功能的。
CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。
单步中断的中断类型码为1,则它所引发的中断过程如下:
(1)取得中断类型码1;
(2)标志寄存器入栈,TF、IF设置为0;
(3) CS、IP入栈;
(4)(IP)=(14),(CS)=(14+2)。
如上所述,如果TF=1,则执行一条指令后,CPU就要转去执行1号中断处理程序。
同样的道理,Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。
在使用 T 命令执行指令时,Debug 将TF设置为 1,使得CPU在工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕上,并且等待输入命令。
总之,当TF=1时,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序。执行完中断处理程序后,又返回原来的位置继续……
我们再来看一下中断过程
(1)取得中断类型码N;
(2)标志寄存器入栈,TF=0、IF=0;
(3)CS、IP入栈;
(4)(IP) = (N4),(CS) = (N4+2)
最后,CPU提供单步中断功能的原因就是,为单步跟踪的执行过程,提供了实现机制。
响应中断的特殊情况
一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。
可是,在有些情况下,CPU 在执行完当前指令后,即便是发生中断,也不会响应。
对于这些情况,我们不一一列举,大家结合实际运用多加体会,这里我们举一种比较典型的情况来进行说明。
例如,在执行完向 ss寄存器传送数据的指令后,即便检测到中断信号,CPU 也不会响应。
这样做的主要原因是,ss:sp联合指向栈顶,而对它们的设置应该连续完成。
因为,如果在执行完设置ss的指令后,CPU响应中断,引发中断过程,要在栈中压入标志寄存器、CS和IP的值。
而ss改变,sp并未改变,ss:sp指向的不是正确的栈顶,将引起错误。
所以CPU在执行完设置ss的指令后,不响应中断。
这给连续设置 ss和sp,指向正确的栈顶提供了一个时机。
即,我们应该利用这个特性,将设置ss和sp的指令连续存放,使得设置sp的指令紧接着设置ss的指令执行,而在此之间,CPU不会引发中断过程。
比如,我们要将栈顶设为1000:0
我们应该
mov ax,1000h
mov ss,ax
mov sp,0
mov ax,0
而不应该
mov ax,1000h
mov ss,ax
mov ax,0
mov sp,0
好了,现在我们回过来看一下,实验2 中的“(3)下一条指令执行了吗?”。
现在你知道原因了吧? !
视频下载
技术, IT技术, 汇编语言, 视频教程
风险提示及免责条款
市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!
