您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第3章 8086指令系统

第4节 中断指令

 

  §3.3.7 中断指令

  中断指令的一般格式为:

  INT n 其中,n称为"中断类型码",n=0~255。

  中断指令"INT n"调用n号中断处理程序,在中断处理程序中,用中断返回指令IRET指令使CPU返回主程序断点继续执行。 中断指令(INT n)和调用程序指令(CALL)很相似,它们均转入内存中其它程序段执行,执行完后再转回。

  主程序用"CALL 目标地址"调用子程序,如图3-25所示。主程序用"INT n"调用中断处理程序,如图3-26所示。数值n是中断处理程序的编号,它代表了中断处理程序的地址。中断处理程序的地址称为"中断矢量"或"中断向量",它是一个4字节值,2字节段地址,2字节偏移量。在8086处理器中,用"中断矢量表"或称"中断向量表"来管理256个中断处理程序的地址。

  中断向量表存放在内存地址最低区域上(0段0000H~03FFH),共1024字节(256×4),其内存放256个中断处理程序的地址。

  例如,设在中断向量表中,0000:0084H~0000:0087H四个单元存放的值依此为00H、20H、00H、30H,则21H号中断处理程序的地址为3000H:2000H。 中断指令INT和中断返回指令IRET的执行过程是:

  INT n:

  ① SP减2,把标志寄存器的值(记为FLAGS)推入堆栈。

  ② 标志位TF和IF清0,以禁止跟踪方式(单步方式)和屏蔽INTR中断。

  ③ SP减2,把返回地址的段值(CS)推入堆栈。

  ④ SP减2,把返回地址的偏移量(IP)推入堆栈。

  ⑤ 根据中断类型码n,从中断矢量表中取得中断处理程序地址,取得的段地址送给CS,偏移量送给IP。从而使CPU转入中断处理程序运行。

  IRET:

  中断处理程序中最后被执行的指令是IRET。其操作是:

  ① 从堆栈中取出一字(INT指令保存的返回地址偏移量),送给 IP,然后使SP加2。

  ② 从堆栈中取出一字(INT指令保存的返回地址段值),送给 CS,然后使SP加2。

  ③ 从堆栈中取出一字(INT指令保存的标志寄存器的值),送给 标志寄存器,然后使SP加2。 IRET执行后,CPU返回到INT指令后面的一条指令。

  几个特殊的中断处理程序:

  (1) 0号中断处理程序

  0号中断处理程序用于处理除法运算溢出,称为"除数为0中断"。当CPU检测到除法运算溢出,自动调用0号中断处理程序,无"INT 0"指令。

  (2) 1号中断处理程序

  当CPU的TF标志置1时,CPU每执行一条指令,就调用1号中断处理程序,因此,它称为"单步中断"。 当CPU检测到TF=1时,自动进入单步方式,无"INT 1"指令。 该中断处理程序用于调试程序。

  (3) 2号中断处理程序

  用于处理NMI非屏蔽硬件中断请求,无"INT 2"指令。

  (4) 3号中断处理程序 用"INT 3"指令调用。称为"断点中断"。用于调试程序。

  (5) 4号中断处理程序 用"INTO"指令调用。该中断处理程序用于处理有符号数运算溢出(OF=1)。称为"溢出中断"。

  中断处理程序的应用:

  (1) BIOS和操作系统(如DOS、Windows)的常用功能程序,一般设计为中断处理程序的形式,用"INT n"指令调用。例如,DOS功能设计为21H号中断处理程序,用"INT 21H"指令调用。

  (2) 硬件中断处理。当外部设备希望CPU处理某事件时,它向中断控制器8259发出一个INTR中断请求,8259再向CPU发出中断请求。

  当CPU响应中断时(发出中断响应信号 ),8259向CPU提供中断类型码,CPU就转入对应的中断处理程序,处理该事件。

  (3) 程序员编写程序时,也可以把常用的功能程序,设计为中断处理程序的形式,用"INT n"指令调用。

  §3.3.8 处理器控制指令

  1、 标志位操作指令

  2、 暂停指令HLT CPU暂停,不执行任何操作。当出现下述情况时,CPU脱离暂停状态。

  (1) 复位。

  (2) 在NMI信号线上有请求。

  (3) 当IF=1时,INTR信号线上有请求。 该指令用于等待硬件中断的发生。

  3、 处理器交权指令ESC和等待指令WAIT

  ESC指令用于调用数学协处理器8087。

  WAIT指令用于等待协处理器完成运算。

  这两条指令配合使用,它们由CPU硬件信号TEST来协调。8087在被初始化后,使TEST信号为"1"。 CPU执行部件(EU)从指令队列中取得指令的机器码,如为ESC指令(数学协处理器指令),则交8087执行。在8087执行指令期间,使TEST信号为"1"。在8087执行指令期间,CPU可执行其他指令(8086与8087并行工作)。8087执行完其操作后,使TEST信号为"0"。

  当8086需要使用8087的操作结果时,首先执行WAIT指令以检查TEST信号是否为"0",若TEST=1(8087未执行完),8086进入空转等待;若TEST=0(8087已执行完),8086执行WAIT后面的指令(这些指令需要8087的操作结果)。

  4、 总线锁定指令LOCK

  该指令是总线锁定前缀,放在其他指令之前。某指令被执行时,如果不希望其他总线主设备占用总线而使该指令被暂停,则在该指令前加前缀指令LOCK,例如:

  LOCK XCHG AL,Varible

  CPU在执行上面的指令时,输出总线锁定信号 ,此时,即使有总线主设备请求总线,CPU要等到该指令执行完后,才允许总线主设备使用总线。

  5、 空操作指令NOP

  CPU执行该指令时,没有实际动作,仅使IP加1(NOP指令的机器码是90H,1字节)。该指令主要用于程序调试。