本文共 1610 字,大约阅读时间需要 5 分钟。
内部中断不需要硬件支持,不受IF标志控制,不执行中断总线周期,除单步中断可通过TF标志允许或禁止外,其余都是不可屏蔽的中断。内部中断分为以下几种:
(1)除法错误中断。CPU在执行触发指令时,若发现除数为0或者所得的商超过了寄存器能容纳的范围,则自动产生一个类型为0的除法错误中断。 (2)单步中断。如果CPU的单步标志TF置1,那么每执行完一条指令后,会自动产生类型为1的单步中断,CPU响应中断后,暂停执行下条指令,转到单步中断服务程序去执行,其结果是将CPU的内部寄存器和有关存储期的内容显示出来,便于跟踪程序的执行过程,实现动态排错。中断服务程序的入口地址通常被称为中断向量或中断矢量。8086可处理256类中断,类型号为0~255(0 ~ FFH)。每类中断有一个入口地址,需用4个字节存储CS和IP,256类中断的入口地址要占用1K字节,它们位于内存0000 ~ 003FFH的区域中,存储了这些地址的连续空间称为中断向量表或中断矢量表。
类型号为0~4的5个中断被定义为专用中断,它们分别是:除法错误中断、单步中断、不可屏蔽中断、断点中断和溢出中断,它们的中断服务程序的入口地址分别存放在00H、04H、08H、0CH和10H开始的4个连续单元中。
CPU 通过中断类型码找到中断向量表和程序地址的位置。I/O ADDR | INT TYPE(16进制) | FUNCTION |
---|---|---|
00 ~ 03 | 0 | 除法错误中断 |
04 ~ 07 | 1 | 单步中断 |
08 ~ 0B | 2 | 非屏蔽中断 |
0C ~ 0F | 3 | 断点中断 |
10 ~ 13 | 4 | 溢出中断 |
14 ~ 17 | 5 | 打印屏幕 |
18 ~ 1F | 6/7 | 保留 |
assume cs:code, ds:data, ss:stackdata segment db 128 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment start: mov ax, stack mov ss, ax mov sp, 128 int 0 ; 除法错误 mov ax, 4C00H int 21H code endsend start
; 以下程序实现 1 ÷ 0 的结果assume cs:code, ds:data, ss:stackdata segment db 256 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segmentstart: mov ax, stack mov ss, ax mov sp, 128 mov ax, 1 mov bl, 0 div bl mov ax, 4C00H int 21 code endsend start例如: 如上图
总结:
存储N号中断源的中断处理程序入口的偏移地址的内存单元的地址中断过程
1.取得中断类型码 2.保存标志位寄存器 → pushf 3.将标志位寄存器的第 8 TF 和 第9位 IF 设置为0 4.push cs 5.push ip 6.cs = N4+2 ip=N4中断处理程序返回的方法
ss:sp ip cs pushf
iret 指令可实现以下的指令
转载地址:http://sbqzi.baihongyu.com/