3.1.5 相关汇编指令

为了有助于读者对中断实现过程的理解,下面介绍几条相关的汇编指令:

(1)       调用过程指令CALL

   指令格式: CALL  过程名

   说明:在取出CALL指令之后及执行CALL指令之前,使指令指针寄存器EIP指向紧接CALL指令的下一条指令。CALL指令先将EIP值压入内,再进行控制转移。当遇到RET指令时,内信息可使控制权直接回到CALL的下一条指令

(2)       调用中断过程的指令INT

   指令格式:INT  中断向量

   说明:EFLAGCSEIP寄存器被压入内。控制权被转移到由中断向量指定的中断处理程序。在中断处理程序结束时,IRET指令又把控制权送回到刚才执行被中断的地方。

(3)       调用溢出处理程序的指令INTO

   指令格式:INTO

说明:在溢出标志为1时,INTO调用中断向量为4的异常处理程序。EFLAGCSEIP寄存器被压入内。控制权被转移到由中断向量4指定的异常处理程序。在中断处理程序结束时,IRET指令又把控制权送回到刚才执行被中断的地方。

(4)       中断返回指令IRET

  指令格式:IRET

 说明:IRET与中断调用过程相反:它将EIPCSEFLAGS寄存器内容从中弹出,并将控制权返回到发生中断的地方。IRET用在中断处理程序的结束处。

(5)       加载中断描述符表的指令LIDT

  格式:LIDT  48位的伪描述符

  说明:LIDT将指令中给定的48位伪描述符装入中断描述符寄存器IDTR。伪描述符和中断描述符表寄存器的结构相同,都是由两部分组成:在低字(低16位)中装的是界限,在高双字(高32位)中装的是基址。这条指令只能出现在内核的代码中。

 

中断或异常处理程序执行的最后一条指令是返回指令IRET。这条指令将使CPU进行如下操作后,把控制权转交给被中断的进程:

·      从中断处理程序的内核中恢复相应寄存器的值。如图3.4,如果一个硬错码被压入堆栈,则先弹出这个值,然后,依次将EIPCSEFLSG中弹出。

·      检查中断或异常处理程序的当前特权级(CPL)是否等于CS中的最低两位,如果是,这就意味着被中断的进程与中断处理程序都处于内核态,也就是没有更换堆栈,因此,IRET终止执行,返回到被中断的进程。否则,转入下一步。

·      中装载SSESP寄存器,返回到用户态堆栈。