第12章 内中断
12.1内中断的产生
除法错误:0,表示出发错误,如执行div指令产生的除法溢出;
单步执行:1;
执行into指令:4;
执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供的CPU的中断类型码。
12.2 中断处理程序
CPU在收到中断信息后,应该转去执行该中断信息的处理程序。
12.3 中断向量表
CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。中断向量表就是中断向量的列表。所谓的中断向量,就是中断处理程序的入口地址。展开来说,中断向量表,就是中断处理程序入口地址的列表。
中断向量表在内存中存放,对于8086PC机,中断向量表指定存放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。
在中断向量表中,对于8086CPU,一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址。
12.4中断过程
CPU收到中断信息后,要对中断信息进行处理,首先将引发中断过程。硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序。
下面是8086CPU收到中断信息后,所引发的中断过程
12.5 中断处理程序和iret指令
中断处理程序的编写方法与子程序的编写方法比较相似,下面是常规的步骤:
1、 保存用到的寄存器
2、 处理中断
3、 恢复用到的寄存器
4、 用iret指令返回
Iret指令的功能用汇编语法描述为:
POP IP
POP CS
Popf
Iret通常和硬件自动完成的中断处理过程配合使用。可以看到,在中断过程中,寄存器入栈的顺序是标志寄存器、CS、IP而iret的出栈顺序是IP、CS、标志寄存器。
Iret指令结束后,CPU回到执行中断处理程序前的执行点继续执行程序
12.6 出发错误中断的处理
以下代码段引发一个除法溢出错误
Mov ax,1000h
Mov bh,1
Div bh
12.7 编程处理0号中断。
12.11单步中断
12.12响应中断的特殊情况
以下的完整的代码显示了如何自定义一个异常处理程序。
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do0;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h;设置es:di指向目标地址
mov cx,offset do0end-offset do0;设置cx为传输长度
cld;设置传输长度为正
rep movsb
mov ax,0;以下设置中断向量表
mov es,ax
mov word ptr es:[0],200h
mov word ptr es:[2],0
mov ax,
int 21h
do0: jmp short do0start
db "overflow!"
do0start: mov ax,cs
mov ds,ax
mov si,202h ;设置ds:si指向字符串
mov ax,0b800h
mov es,ax
mov di,12*160+36*2;设置es:di指向显存空间的中间位置
mov cx,9 ;设置cx为字符串长度
s:mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,
int 21h
do0end:nop
code ends
end start
将上述代码复制到p77.txt文件并编译,然后引发一个除法异常,将在屏幕中间显示overflow!字符串。
来源:https://www.cnblogs.com/lanru/archive/2011/10/27/2226007.html