当前位置:鱼C工作室 >汇编语言 > 查看文章

内中断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)=(1*4),(CS)=(1*4+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) = (N*4),(CS) = (N*4+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)下一条指令执行了吗?”。

现在你知道原因了吧? !


为您推荐

报歉!评论已关闭.