0
点赞
收藏
分享

微信扫一扫

汇编语言 内部中断

内部中断不需要硬件支持,不受IF标志控制,不执行中断总线周期,除单步中断可通过TF标志允许或禁止外,其余都是不可屏蔽的中断。内部中断分为以下几种:
(1)除法错误中断。CPU在执行触发指令时,若发现除数为0或者所得的商超过了寄存器能容纳的范围,则自动产生一个类型为0的除法错误中断。
(2)单步中断。如果CPU的单步标志TF置1,那么每执行完一条指令后,会自动产生类型为1的单步中断,CPU响应中断后,暂停执行下条指令,转到单步中断服务程序去执行,其结果是将CPU的内部寄存器和有关存储期的内容显示出来,便于跟踪程序的执行过程,实现动态排错。

中断向量表

  1. 中断服务程序的入口地址通常被称为中断向量或中断矢量。8086可处理256类中断,类型号为0~255(0 ~ FFH)。每类中断有一个入口地址,需用4个字节存储CS和IP,256类中断的入口地址要占用1K字节,它们位于内存0000 ~ 003FFH的区域中,存储了这些地址的连续空间称为中断向量表或中断矢量表。
  2. 类型号为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:stack

data segment
db 128 dup(0)
data ends

stack segment stack
db 128 dup(0)
stack ends

code segment
start: mov ax, stack
mov ss, ax
mov sp, 128

int 0   ; 除法错误

mov ax, 4C00H
int 21H

code ends

end start

汇编语言 内部中断_服务程序

; 以下程序实现 1 ÷ 0 的结果
assume cs:code, ds:data, ss:stack

data segment
db 256 dup(0)
data ends


stack segment stack
db 128 dup(0)
stack ends


code segment

start:
mov ax, stack
mov ss, ax
mov sp, 128

mov ax, 1
mov bl, 0
div bl

mov ax, 4C00H
int 21
code ends

end start

汇编语言 内部中断_服务程序_02
例如:
汇编语言 内部中断_中断向量表_03
如上图

  • 0号中断源对应的中断处理程序的入口地址为: F000:1060
  • 1号中断源对应的中断处理程序的入口地址为: 01A3:13BB
  • 2号中断源对应的中断处理程序的入口地址为: 0070:0008
  • 3号中断源对应的中断处理程序的入口地址为: 01A3:13B1

总结:
存储N号中断源的中断处理程序入口的偏移地址的内存单元的地址

  • 段地址:N * 4 + 2
  • 偏移地址: N * 4

中断过程
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 指令可实现以下的指令

  • pop ip
  • pop cs
  • popf

举报

相关推荐

0 条评论