- 1、本文档共1285页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
12.2 中断处理程序 比如CPU 根据中断类型码 4,就可以找到4号中断的处理程序。 可随之而来的问题是,若要定位中断处理程序,需要知道它的段地址和偏移地址,而如何根据 8位的中断类型码得到中断处理程序的段地址和偏移地址呢? 12.3 中断向量表 CPU用 8 位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。 那么什么是中断向量表呢? 中断向量表就是中断向量的列表。 12.3 中断向量表 中断向量表在内存中保存,其中存放着 256个中断源所对应的中断处理程序的入口,如下图所示: 12.3 中断向量表 中断向量表在内存中存放,对于8086PC机,中断向量表指定放在内存地址0处。 从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。 特别提示 检测点12.1(p227) 没有完成此检测点,请不要向下进行。 12.4 中断过程 从上面的讲解中,我们知道,可以用中断类型码,在中断向量表中找到中断处理程序的入口。 找到这个入口地址的最终目的是用它设置CS和IP,使CPU执行中断处理程序。 12.4 中断过程 用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。 CPU 硬件完成这个工作的过程被称为中断过程。 12.4 中断过程 在使用 call 指令调用子程序时有同样的问题,子程序执行后还要返回到原来的执行点继续执行, 所以,call 指令先保存当前 CS 的 IP值,然后再设置CS和IP。 12.4 中断过程 8086CPU的中断过程: (1)(从中断信息中)取得中断类型码; (2)标志寄存器的值入栈( 因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中。); (3)设置标志寄存器的第8位TF 和第9位IF的值为0;(这一步的目的后面将介绍) (4)CS的内容入栈; (5)IP的内容入栈; (6)从内存地址为中断类型码*4 和中断类型码 *4+2 的两个字单元中读取中断处理程序的入口地址设置IP和CS。 12.4 中断过程 CPU在收到中断信息之后,如果处理该中断信息,就完成一个由硬件自动执行的中断过程。 (程序员无法改变这个过程中所要做 的工作) 12.4 中断过程 中断过程的主要任务就是用中断类型码在中断向量表中找到中断处理程序的入口地址,设置CS和IP。 因为中断处理程序执行完成后,CPU还要回过头来继续执行被中断的程序, 所以要在设置CS、IP之前,先将它们的值保存起来。 12.4 中断过程 可以看到CPU将它们保存在栈中。 我们注意到,在中断过程中还要做的一个工作就是设置标志寄存器的TF、IF位。 对于这样做的目的,我们将在后面的内容和下一章中进行讨论。 12.4 中断过程 因为在执行完中断处理程序后,需要恢复在进入中断处理程序之前的CPU现场 (某一时刻,CPU中各个寄存器的值)。 所以应该在修改标记寄存器之前,将它的值入栈保存。 12.4 中断过程 我们更简洁的描述中断过程,如下: (1)取得中断类型码N; (2) pushf (3) TF = 0,IF = 0 (4) push CS (5) push IP (6)(IP) = (N*4),(CS) = (N*4+2) 在最后一步完成后,CPU 开始执行由程序员编写的中断处理程序。 中断过程演示 12.5 中断处理程序 由于CPU随时都可能检测到中断信息,也就是说,CPU 随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存某段空间之中。 而中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中。 12.5 中断处理程序 中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤: (1)保存用到的寄存器。 (2)处理中断。 (3)恢复用到的寄存器。 (4)用 iret 指令返回。 iret指令的功能用汇编语法描述为: pop IP pop CS popf 12.5 中断处理程序 iret通常和硬件自动完成的中断过程配合使用。 可以看到,在中断过程中,寄存器入栈的顺序是标志寄存器、CS、IP ,而iret的出栈顺序是 IP、CS、标志寄存器,刚好和其对应,实现了用执行中断处理程序前的CPU现场恢复标志寄存器和CS、IP的工作。 12.5 中断处理程序 iret指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序。 12.6 除法错误中断的处理 下面的内容中,我们通过对 0号中断,即除法错误的中断处理,来体会一下前面所讲的内容。 12.6 除法错误中断的处理 当CPU执行div等除法指令的时候,如果发生了除法溢出错误,将产生中断类型码为 0 的中断信息,CPU将检测到这个信息,
文档评论(0)