编写0号中断的处理程序:处理除法溢出

October 17, 2013
masm

在除法溢出的时候,在屏幕中间显示字符串“divide error!”

安装程序:

assume cs:code

code segment
start:
    mov ax, cs
    mov ds, ax
    mov si, offset do0

    mov ax, 0
    mov es, ax
    mov di, 200h
    mov cx, offset do0end - offset do0
    cld
    rep movsb

    mov ax, 0
    mov ds, ax
    mov word ptr ds:[0*4], 200h
    mov word ptr ds:[0*4 + 2], 0

do0:
    jmp do0start
    db "divide error!"
do0start:
    mov ax, cs
    mov ds, ax
    mov si, 202h

    mov ax, 0b800h
    mov es, ax
    mov di, 12*160+36*2

    mov cx, 13
s:
    mov al, [si]
    mov es:[di], al
    mov byte ptr es:[di+1], 01001001b
    inc si
    add di, 2
    loop s

    mov ax, 4c00h
    int 21h
do0end:
    nop

    mov ax, 4c00h
    int 21h
code ends

end start

测试程序:

assume cs:code

code segment
start:
    mov dx, 0
    div dx

    mov ax, 4c00h
    int 21h
code  ends

end start

debug执行这个程序,会发现执行到div dx的时候,屏幕中间会出现红底蓝字的divide error!

基本是照着书上的思路写的

注意,这里有一个要注意的问题,尤其是要显示颜色的时候,在37行,如果不加byte ptr,那么会默认当做字传送,最终会多出一个小方格,也就是乱码,这个问题以前也遇到过,刚才忘了,幸好很快就想到了。这里记录一下。

comments powered by Disqus