汇编语言(王爽第三版)实验12 编写0号中断的处理程序
实验12 编写0号中断的处理程序
编写0号中断处理程序,使得在除法溢出时,在屏幕中间显示字符串'divide error!',然后返回dos。
实验分析:
(1)按照12.9小节中分析的,编写一个do0程序,这个不难,
;------
;程序名称:do0
;功能:在屏幕中央显示字符串,显示“除法溢出”。
;入口参数:无
;返回值:无
;------
(2)编写一个装载do0的程序,并设置中断向量指向do0入口。
这个在书中前面几个小节都有详细的介绍。
(3)下面的测试重要。
程序汇编代码如下(将do0 0号中断处理程序装载到0000:200H中,并设置中断向量表0号表项的中断向量指向该程序入口。):
assume cs:code
code segment
start: mov ax, code
mov ds, ax
mov si, offset do0 ;设置源内存单元地址
mov ax, 0000H
mov es, ax
mov di, 0200H ;设置目标内存单元地址0000:0200H
mov cx, offset do0end - offset do0 ;设置传输的长度。
cld ;传输方向为正,即si和di增加。
rep movsb
;设置中断向量表,将0号中断向量设置为0000:0200H
mov ax, 0000H
mov es, ax
mov word ptr es:[0*4], 0200H
mov word ptr es:[0*4+2], 0000H
mov ax, 4c00H
int 21H
;------
;程序名称:do0 0号中断处理程序,被装载到0000:200H
;功能:在屏幕中央显示字符串,显示“除法溢出”。
;入口参数:无
;返回值:无
;------
do0: jmp short do0start
db 'divide error!'
do0start:
mov ax, cs
mov ds, ax
mov si, 0202H ;设置ds:si指向字符串。
mov ax, 0b800H
mov es, ax
mov di, 12*160+36*2 ;设置es:di指向显存,(屏幕中央)
mov cx, 13 ;字符串长度13
s: mov al, [si]
mov es:[di], al ;
inc si
add di, 2 ;显存2个字节代表一个字,其中奇数代表字符。
loop s
mov ax, 4c00H
int 21H
do0end: nop
code ends
end start
程序说明:
(1)此程序的目的是将do0这个中断处理程序的指令代码的机器码装载到内存0000:200h处,并设置中断向量指向该程序入口。也就是说,此程序执行完毕后,有一个新的中断程序do0,实时的驻留在内存中,并实时响应中断类型码为0的事件。
(2)关于rep movsb它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,注意源内存和目的内存的表示方法。
(3)为什么有do0end: nop?如果没有这个指令,我们无法自动的统计出do0这个程序的机器码的长度,有这个指令在do0机器码的最后结尾作为标记,我们就能使用offset do0end - offset do0这个获得do0的长度了。
程序调试跟踪:
(1)此程序编译连接后,可以直接就运行它的exe文件,也可以在debug中逐步调试。
(2)运行完这个程序后,只要不退出dos模式窗口,我们发现:0号中断向量的指向改变了,指向了0000:0200H,如图(在命令提示符下,直接键入debug即可):
-d 0000:0
0000:0000 00 02 00 00 8B 01 70 00-16 00 9E 03 8B 01 70 00 ......p.......p.
(3)查看0000:0200H内存内容:
-d 0000:200
0000:0200 EB 0D 64 69 76 69 64 65-20 65 72 72 6F 72 21 8C ..divide error!.
0000:0210 C8 8E D8 BE 02 02 B8 00-B8 8E C0 BF C8 07 B9 0D ................
0000:0220 00 8A 04 26 88 05 46 83-C7 02 E2 F5 B8 00 4C CD ...&..F.......L.
0000:0230 21 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 !...............
果然在这段内存存储着do0的机器码。
(4)在debug下,或自己编写个小程序,执行下,看看除法溢出的结果。
测试小程序如下:
assume cs:code
code segment
start: mov ax, 1000H
mov bl, 1H
div bl
mov ax, 4c00H
int 21H
code ends
end start
结果:


浙公网安备 33010602011771号