编写0号中断处理程序,使得在除法溢出时,在屏幕中间显示字符串'divide error!',然后返回dos。
前面讲到,内存0000:0000~0000:03FF,大小为1KB的空间是系统存放中断处理程序入口地址的中断向量表。8086支持256个中断,但是,实际上,系统要处理的中断事件远没有达到256个,所以在向量列表中,有许多单元是空的。
中断向量表睡觉哦PC系统中最重要的内存区,只用来存放中断处理程序的入口地址,DOS系统和其他应用程序都不会随便使用这段空间。可以利用中断向量表中的空闲单元来存放我们的程序,一般情况下,从0000:0200~0000:02FF的256个字节的空间所对应的中断向列表项都是空的,操作系统和其他应用都不会占用。
根据本章内容的学习编写不难编写该实验,按照文中所述我们编写一个do0程序作为0号中断的中断处理程序,即我们需要将中断处理程序do0放到000:0200后。若要是的除法溢出的时候,cpu转去执行do0,则必须将do0的入口地址,及0000:02;;登记在中断向量表的对应表项中,因为除法溢出对应的中断类型码为0,他的中断处理程序的入口地址应该从0*4地质单元开始存放,段地址存放在0*4+2字单元中,偏移地址存放在0*4字单元中,也就说要将do0的段地址0存放在0000:0002字单元中,将偏移地址200H存放在0000:0000字单元中,总结以上分析,需要做以下几件事情
(1)编写可以显示divide error!的中断处理程序:do0;
(2)将do0送入内存0000:0200处;
(3)将do0的入口地址0000:0200存储在中断向量表0号表项中
程序源码如下:
assume cs:code
code segment
begin:mov ax, cs
mov ds, ax
mov si, offset do0
mov ax, 0
mov es, ax
mov di, 200h
;将中断处理程序送入0:200地址处
mov cx, offset do0end - offset do0
cld
rep movsb
;设置中断向量表
mov ax, 0
mov es, ax
mov word ptr es:[0*4], 200h
mov word ptr es:[0*4+2], 0
;测试程序
mov ax, 1000h
mov bh, 1
div bh
mov ax, 4c00h
int 21h
;显示中断处理overflow
do0:jmp short do0start
db "divide error!"
do0start:mov ax, cs
mov ds, ax
mov si, 202h
mov ax, 0b800h
mov es, ax
mov di, 12*160+72
mov cx, 13
s:mov al, [si]
mov es:[di], al
inc si
add di, 2
loop s
mov ax, 4c00h
int 21h
do0end: nop
code ends
end begin
程序未执行前0000:0200-0000:02FF处的内容为
执行后,结果显示为
内存0000:0200~0000:02FF处存放了我们编写的0号中断的中断处理程序,如下图