内中断的产生
来源及中断码
- 除法错误:0
- 单步执行:1
- 执行into指令:4
- 执行int n指令:n
中断向量表
中断过程
CPU收到中断信息后,根据中断向量表,跳转到相应的中断程序中处理中断,这一过程称为中断过程
- 从中断信息中取得中断向量码N
- 标志寄存器入栈(因为中断过程中要改变标志寄存器的值)
- 设置标志寄存器的第8位TF和第9位IF的值为0
- CS入栈
- IP入栈
- (IP)=(4N) ; (CS)=(4N+2)
更简洁的表示
1, 取得中断向量码N
2,pushf
3,TF=0,IF=0
4,push cs
5.push ip
6,(IP)=(N*4) ; (CS)=(N*4+2)
中断处理程序和iret指令
编写中断处理程序的步骤和子程序相似,下面是基本步骤:
- 保存用到的寄存器
- 处理中断
- 恢复用到的寄存器
- 用
iret
返回
iret
指令用汇编语法描述为
pop ip
pop cs
popf
编写0号中断
目标:当发生除法错时,在屏幕显示“overflow!”,返回DOS
步骤:
- 编写可以显示“overflow!”的中断处理程序:do0
- 安装程序,将do0传送在内存0000:0200处
- 设置中断向量表,将do0的入口地址存储在中断向量表0号表项中
do0为什么存储在0000:0200处
assume cs:codecode segment
start: ;将中断例程复制到0000:0200h处mov ax,csmov ds,axmov si,offset do0mov ax,0mov es,axmov di,0200hmov cx,offset do0end-offset do0cldrep movsb;将中断例程的地址,添加到中断向量表mov ax,0mov es,axmov word ptr es:[0*4],0200hmov word ptr es:[0*4+2],0mov ax,1mov bl,0div blmov ax,4c00hint 21h;0号中断例程,显示字符串overflow!
do0:jmp short do0startdb 'overflow!'
do0start:mov ax,csmov ds,axmov si,202hmov ax,0b800hmov es,axmov di,12*160+36*2mov cx,9
s: mov al,[si]mov es:[di],alinc siadd di,2loop smov ax,4c00hint 21h
do0end:nop
code ends
end start
为什么此处的中断例程没有iret而是结束程序了?因为题目要求触发除法中断后直接返回DOS,而不是主程序