s1:
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
push cs
pop ds
mov ax,0b800h
mov es,ax
lea si,str1
mov di,160*10
cld
s2:
lodsb
or al,al
jz s3
mov ah,7
stosw
jmp short s2
s3:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
MSG db 0ah,0dh,0ah,0dh," operation caused a devide overflow error !",0ah,0dh,0ah,0dh,"$",00
Int0:
push bp
mov bp,sp
push ax
push dx
push ds
inc word ptr[bp+2]
inc word ptr[bp+2]
push cs
pop ds
lea dx,MSG
mov ah,09h
int 21h
pop ds
pop dx
pop ax
mov sp,bp
pop bp
iret
GetI:
push bp
mov bp,sp
push ax
push bx
push si
push ds
xor ax,ax
mov ds,ax
xor si,si
mov bx,[si]
mov ax,[si+2]
mov [bp+4],ax
mov [bp+6],bx
pop ds
pop si
pop bx
pop ax
mov sp,bp
pop bp
retn
SetI:
push bp
mov bp,sp
push ax
push bx
push si
push ds
xor ax,ax
mov ds,ax
xor si,si
mov ax,[bp+4]
mov bx,[bp+6]
cli
mov [si],bx
mov [si+2],ax
sti
pop ds
pop si
pop bx
pop ax
mov sp,bp
pop bp
retn
BEGIN:
push ax
push bx
call GetI
pop bx
pop ax
mov IPD,ax
mov CSD,bx
当中断发生时,所有寄存器均维持原样没有任何问题,问题是返回地址指向 div cl 指令,如果不处理,中断返回后,还将继续执行 div cl 指令,程序将会陷入死循环。所以,在中断处理程序中,需要把返回地址的 IP 值增加 2(因为 div cl 指令长度为 2 个字节),以保证中断返回后,从 div cl 的下一条指令处继续执行。