汇编笔记_第十二章

title: 汇编笔记_第十二章
date: 2019-01-01 18:49:05
tags:

笔记
categories:

汇编语言

内中断 中断的产生

中断
中断分为 软件中断 和 硬件中断,前者又称为内中断后者又称为外部中断;

软件中断: 由CPU内部的某些事件引起的,不受中断允许标志IF的控制。包括:

由终端指令 int n 引起,n指出中断类型

由CPU的某些错误引起,除法错中断(类型号0)、溢出中断(类型号4)

为调试程序Debug设置的中断,单步中断(类型号1)、断点中断(类型号3)

硬件中断: 由输入输出外设产生的中断请求引起的中断。
8086系统的硬件中断可分为 可屏蔽中断 和 不可屏蔽中断。所有的中断请求都有对应的中断处理子程序与之对应;

补充:

内中断中,int n和into指令产生的中断以及出发错中断都不能被禁止,并且比任何外部中断的优先级都高;

8086系统的硬件中断都是通过CPU的引脚引入中断请求型号,不可屏蔽中断请求信号接到CPU的NMI引脚上,当发生电源故障,奇偶检验错,io通道校验错等紧急情况时有系统自动产生,NMI不可屏蔽中断的类型号为2;

可屏蔽中断是键盘、显示器、打印机、磁盘、串口、并口等外设发出的。由于可屏蔽中断种类较多,系统专门有8259A中断控制器来管理这些中断。可屏蔽中断指这些外设可以用软件设置允许或禁止器发出中断请求。8086可屏蔽中断的中断类型号为08H~0FH;

优先级由高到低:内部中断-非屏蔽中断-可屏蔽中断-单步中断;

硬件中断时,CPU执行完一条指令后都会读取INTR引脚信号;

软件中断时,若为0-4号中断,CPU按相应的方式处理,如果是int n指令,则由n获取中断向量转而执行中断处理程序;

单步中断是int 1(TF=1);

中断处理程序

CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系,使得CPU可以根据中断信息可以找到哟啊执行的处理程序;

中断类型和中断向量表

8086提供了256个中断类型,类型号为0~FFH;

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

用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的,这个过程称为 中断过程

8086中专门建立了一张中断向量表用于保存所有的中断向量。表位于内存最低地址区0开始的1KB单元。每个中断向量占用4个字节,高位放段地址,低位放偏移地址;

中断向量表的地址为:00000H~003FCH;

其中,

5个专用中断:类型0中断(出发出错)00000H~00003H,保存ip和cs内容、类型1中断(单步中断)00004H~00007H、类型2中断(NMI)00008H~0000BH、类型3中断(断点中断)0000CH~0000FH、类型4中断(溢出中断)00010H~00013H;

27个系统保留中断:类型5中断~类型31中断00014H~0007FH;

224个用户自定义中断: 类型32中断~类型255中断00080H~003FCH;

中断过程

8086CPU的中断过程:

1、取得中断类型码

2、标志寄存器的指入栈

3、设置标志寄存器的第8位TF和第9位IF的值0

4、CS的内容入栈

5、IP的内容入栈

6、从内存地址位中断类型码*4和中断类型码*4+2的两个字的单元中读取中断处理程序的入口地址设置IP和CS

在使用call指令调用子程序时有同样的问题,子程序执行后还要返回到原来的执行点继续执行,所以,call指令先保存当前CS和IP值,然后设置CS和IP跳转;

中断处理程序和iret指令

CPU要随时都可能执行中断程序,所以中断处理程序必须一直在内存的某段空间中;同时,中断程序的入口地址,即中断向量必须储存在对应的中断向量表表项中;

中断处理程序的编写方法:

1、保存用到的寄存器

2、处理中断

3、恢复用到的寄存器

4、用 iret 指令返回

iret指令的功能用汇编语法描述为:

pop IP pop CS popf

iret通常和硬件自动完成的中断程序配合使用;

入栈的顺序时标志寄存器、CS、IP,和iret的出栈相反;

编写处理0号中断

当发生出发溢出时,CPU将进行以下工作:

1、取得中断类型码0

2、标志寄存器入栈,TF、IF设置为0

3、CS、IP入栈

4、(IP)=(0*4),(CS)=(0*4+2)

中断处理程序do0,只需显示"overflow!"

1、相关处理

2、向显示缓冲区送入字符串"overflow!"

3、返回dos

因为除法溢出随时可能发生,CPU随时可能将cs:ip指向do0的入口,执行程序,所以为了简单可以将中断处理程序do0放到中断向量表的0000:0200处;

所以最后的处理是;

1、编写可以显示"overflow!"的中断程序do0;

2、将do0送到内存0000:0200处

3、将do0的入口地址0000:0200存储在中断向量表0号表项中

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzgg.html