汇编语言 实验12 编写0号中断的处理程序
1.需要的基础知识
中断:
CPU收到某种特殊信号之后,停下手头的工作,转向处理发出这种特殊信号的程序。而这种特殊的信号,就叫做中断。
一共有四种中断类型:
1.除数为0的错误
2.单步执行(标志寄存器TF位=1时执行,如t指令)
3.执行into指令
4.执行int指令
我们之前写的程序的结尾一般都是mov ax,4c00h int 21h
后面这个int 21h就是中断指令,21h代表的就是中断向量表中的第21h个中断处理程序,所以int 21h连起来的意思就是,执行21h号中断处理程序。
中断向量表:
当CPU处理中断的时候,需要将CS:IP指向对应的中断处理程序。而中断处理程序的入口地址(段地址:偏移地址)是放在一张表中的。入口地址叫做中断向量(即段地址+偏移地址一共四个字节的信息,前两个字节代表中断处理程序的偏移地址,后两个字节代表的是段地址),而这张表就叫做中断向量表。
中断的过程:
1.获得中断类型码N
2.pushf(flag寄存器入栈)
3.TF=0(见上面的中断类型2),IF=0
4.push CS
5.push IP
6.IP=N*4,CS=N*4+2
2.自己编写一个0号中断的处理程序!(即上面的中断类型1:除法出错)
assume cs:code
code segment
start: mov ax,0
mov ds,ax
mov word ptr ds:[0],200h
mov word ptr ds:[2],0
mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0_end-offset do0
cld
rep movsb
mov ax,1
mov cx,0
div cx
mov ax,4c00h
int 21h
do0:
jmp do0_start
db "divide error!"
do0_start:
mov ax,0b800h
mov es,ax
mov di,1680
mov ax,0
mov ds,ax
mov si,203h
mov cx,13
s: mov al,ds:[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0_end:nop
code ends
end start
输出结果: