编写0号中断处理程序,本程序逻辑上分两步实现:首先,编写安装程序,即将中断程序安装在0号中断向量表中;其次,编写发生0号中断时,要指向的程序。
本程序是按照书中的解释,逐步完成的。其精妙的地方在于,将‘’overflow!’ 存放在cs中的do0(相当于函数的开始位置)中,写成了“ jmp short do0start db 'overflow!',0
,避免了如果将其存放在data段中,当程序执行完毕后,导致的data段释放问题。
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 ;找出中断执行程序长度,循环用
cld ;正向移动,inc si,inc di
rep movsb ;s: mov byte ptr es:[di],[si] inc si,inc di,
;修改中断向量表
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h ;偏移地址 N*4
mov word ptr es:[0*4+2],0 ;段地址 N*4+2
mov ax,101
mov dx,1000
mov bx,1
div bx
mov ax,4c00h
int 21h
;===============================================
;名称:中断执行程序
;功能:0号中断发生时,调用该函数
;参数:无
;举例说明:调用非法的div bx,在屏幕中显示:overflow!
;===============================================
do0:
jmp short do0start ;jmp short占两个字节
db 'overflow!',0 ;这样写很微妙,数据一起送入0200h:0000位置,不会丢失
do0start:
mov ax,cs
mov ds,ax
mov si,202h ;因为jmp short do0start占两个字节
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,9
mov ah,01000010B
s: mov al,[si]
mov word ptr es:[di+0],ax
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end: ;注意这个位置要加上一个 nop
nop
code ends
end start