内中断04 - 零基础入门学习汇编语言63
2011-04-26 14:37
501 查看
第十二章:内中断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)下一条指令执行了吗?”。
现在你知道原因了吧? !
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LYMMXENSJUDT']视频下载[/Downlink]
相关文章推荐
- 内中断04 - 零基础入门学习汇编语言63
- [BX]和loop指令04 - 零基础入门学习汇编语言26
- 转移指令的原理04 - 零基础入门学习汇编语言46
- 转移指令的原理04 - 零基础入门学习汇编语言46
- Call指令和Ret指令讲解04 - 零基础入门学习汇编语言51
- 内中断02 - 零基础入门学习汇编语言61
- Call指令和Ret指令讲解04 - 零基础入门学习汇编语言51
- 内中断01 - 零基础入门学习汇编语言60
- 内中断02 - 零基础入门学习汇编语言61
- 内中断01 - 零基础入门学习汇编语言60
- 外中断03 - 零基础入门学习汇编语言71
- 外中断03 - 零基础入门学习汇编语言71
- 寄存器(内存访问)04 - 零基础入门学习汇编语言16
- 外中断02 - 零基础入门学习汇编语言70
- 基础知识04 - 零基础入门学习汇编语言04
- 寄存器(内存访问)04 - 零基础入门学习汇编语言16
- 外中断01 - 零基础入门学习汇编语言69
- 外中断02 - 零基础入门学习汇编语言70
- 基础知识04 - 零基础入门学习汇编语言04
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09