汇编语言 实验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.获得中断类型码N2.pushf(flag寄存器入栈)3.TF=0(见上面的中断类型2),IF=04.push CS5.push IP6.IP=N*4,CS=N*4+2
2.自己编写一个0号中断的处理程序!(即上面的中断类型1:除法出错)
assume cs:codecode segmentstart: 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 ;test mov ax,1 mov cx,0 div cx mov ax,4c00h int 21hdo0: 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,13s: mov al,ds:[si] mov es:[di],al inc si add di,2 loop s mov ax,4c00h int 21hdo0_end:nopcode endsend start