汇编语言(第3版,王爽著):实验12 编写 0 号中断的处理程序
1. 我们要做以下几个事情:
- 编写可以显示 "divide error!" 的中断处理程序:do0
- 将 do0 送入内存 0000:0200 处
- 将 do0 的入口地址 0000:0200 存储在中断向量表 0 号表项中
- 编写一个除法溢出的测试程序,用于触发除法错误,产生内中断
2. 代码实现:
文件名:exp12.asm
assume cs:code
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset do0 ; 设置 ds:si 指向源地址
mov ax, 0
mov es, ax
mov di, 200h ; 设置 es:di 指向目的地址
mov cx, offset do0end - offset do0 ; 设置 cx 为传输长度
cld ; 设置传输方向为正
rep movsb
; 设置中断向量表
mov ax, 0
mov es, ax
mov word ptr es:[0 * 4], 200h ; 中断处理程序的偏移地址
mov word ptr es:[0 * 4 + 2], 0h ; 中断处理程序的段地址
mov ax, 4c00h
int 21h
do0:
jmp short do0start
db "divide error!"
do0start:
mov ax, cs
mov ds, ax
mov si, 202h ; 设置 ds:si 指向字符串
mov ax, 0b800h
mov es, ax
mov di, 12*160 + 36*2 ; 设置 es:di 指向显存空间的中间位置
mov cx, 13 ; 设置 cx 为字符串的长度
s:
mov al, ds:[si]
mov es:[di], al
mov byte ptr es:[di + 1], 02h ; 设置字符属性
inc si
add di, 2
loop s
mov ax, 4c00h
int 21h
do0end:
nop
code ends
end start
3. 跟踪调试过程:
4. 测试程序:
参考书本第 12 章中的例子,编写一个除法溢出的测试程序
文件名:exp12div.asm
assume cs:code
code segment
start:
mov ax, 1000h
mov bh, 1
div bh
mov ax, 4c00h
int 21h
code ends
end start