汇编 (十) 内中断

1.1 内中断的产生

当CPU内部有下面内容发生的时候,将产生相应的中断信息,

8086CPU使用中断类型码的数据来标识中断信息的来源,中断类型码为一个字节型数据,可以表示256种中断信息来源。

  • 除法错误,比如div指令产生的除法溢出      //中断类型码为0
  • 单步执行                                                      //中断类型码为1
  • 执行info指令                                                //中断类型码为4
  • 执行int指令                                                  //指令格式为Int n ,n为提供给CPU的中断类型码

 

1.2 中断向量表

CPU用 8位的中断类型码 通过 中断向量表 找到相应的 中断处理程序的入口地址。

中断向量:中断处理程序的入口地址。

中断向量表:中断处理程序入口地址的列表。

 

CPU如何找到中断向量表?

中断向量表在内存中存放,在8086PC机中,中断向量表指定放在内存地址0处。从内存0000:0000到0000:03ff的1024个单元中存放着中断向量表。

 

在中断向量表中一个表项占多大空间?

一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,这个入口地址包括 段地址 和  偏移地址。所以一个表现占两个字节,高地址字存放段地址,低地址字存放偏移地址。

 

1.3 中断过程

中断过程 是指在中断向量表中找到中断处理程序的入口,最终目的是用入口地址设置CS和IP,使CPU执行中断处理程序。这个过程是由硬件自动完成。硬件自动完成之后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序。

在设置CS:IP之前,需要将原来的CS:IP值保存在 栈 中。

 

过程如下:

  • 从中断信息中取得中断类型码 N
  • 标志寄存器的值入栈                                         //pushf
  • 设置标志寄存器的第8位TF和第9位IF的值为0  //TF=0,IF=0
  • CS:IP内容入栈保存                                           //push CS , push IP
  • 从内存地址为中断类型码*4 和 中断类型码*4+2 的两个字单元中读取中断处理程序的入口地址设置IP和CS                                                                                                                                                                    // IP=N*4 CS=N*4+2

 

1.4 iret指令

中断处理程序编写方法:

  • 保存用到的寄存器
  • 处理中断
  • 恢复用到的寄存器
  • 用iret指令返回    //恢复标志寄存器,CS,IP

 

iret指令功能用汇编描述:

pop IP

pop CS

popf

在中断过程中,寄存器入栈顺序:标志寄存器,CS, IP

iret的出栈顺序是IP, CS, 标志寄存器。

 

1.5 响应中断的特殊情况

一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。

但是,在有些情况下,CPU在执行完当前指令后,即便发生中断,也不会响应,比如:

在执行完向ss寄存器传送数据的指令后,即便是发生中断,CPU也不会响应。

主要原因是:

ss:sp联合指向栈顶,而对他们的设置应该连续完成。

 

 

你可能感兴趣的:(汇编)