文章目录[隐藏]
下面,将 do0 的入口地址 0:200,写入中断向量表的 0 号表项中,使 do0 成为 0 号中断的中断处理程序。
0号表项的地址为o:o,其中o:o字单元存放偏移地址,0:2字单元存放段地址。程序如下。
mov ax,0 mov es,ax mov word ptr es:[0*4],200h mov word ptr es:[0*4+2],0
单步中断
基本上,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 号中断处理程序。
如上所述,如果 TF=1 时,CPU 在执行完一条指令后将引发单步中断,转去执行中断处理程序。CPU为什么要提供这样的功能呢?
最后,CPU 提供单步中断功能的原因就是,为单步跟踪程序的执行过程,提供了实现机制。
我们在使用Debug的t命令的时候,有没有想过这样的问题,Debug如何能让CPU在执行一条指令后,就显示各个寄存器的状态?我们知道,CPU在执行程序的时候是从CS:IP指向的某个地址开始,自动向下读取指令执行。也就是说,如果CPU不提供其他功能的话,就按这种方式工作,只要CPU一加电,它就从预设的地址开始一直执行下去,不可能有任何程序能控制它在执行完一条指令后停止,去做别的事情。可是,我们在Debug中看到的情况却是,Debug可以控制CPU执行被加载程序中的一条指令,然后让它停下来,显示寄存器的状态。
Debug有特殊的能力吗?我们只能说Debug利用了CPU提供的一种功能。只有CPU 提供了在执行一条指令后就转去做其他事情的功能,Debug或是其他的程序才能利用CPU 提供的这种功能做出我们使用T命令时的效果。
好了,我们来简要地考虑一下Debug是如何利用CPU所提供的单步中断的功能的。首先,Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。然后,在使用t命令执行指令时,Debug将TF设置为I,使得CPU工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕_[,并且等待输入命令。
那么,接下来的问题是,当TF=I时,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序。注意,中断处理程序也是由一条条指令组成的,如果在执行中断处理程序之前,TF=I,则、CPU在执行完中断处理程序的第一条指令后,又要产生单步中断,则又要转去执行单步中断的中断处理程序,在执行完中断处理程序的第一条指令后,又要产生单步中断,则又要转去执行单步中断的中断处理程序……
看来,上面的过程将陷入一个永远不能结束的循环,CPU永远执行单步中断处理程序的第一条指令。
CPU当然不能让这种情况发生,解决的办法就是,在进入中断处理程序之前,设置TF=0。从而避免CPU在执行中断处理程序的时候发生单步中断。这就是为什么在中断过程中有TF=0这个步骤,我们再来看一下中断过程。
(1)取得中断类型码
(2)标志寄存器入栈,TF=0、IF=0
(3)CS、IP 入栈
(4)(IP)=(N*4),(CS)=(N*4+2)
最后,cPu提供单步中断功能的原因就是,为单步跟踪程序的执行过程,提供了实现机制。