使用JGE/JLE引发除法溢出错误的问题
我最近编写一个程序画矩形,其中包含一些条件转移语句,可是执行到那里的时候总是发生Divide Overflow,请问问题出在那里:
.model small
.stack
.data
hollow dw 20d,20d,100d,70d
solid dw 60d,45d,140d,95d
x1 dw ?
y1 dw ?
x2 dw ?
y2 dw ?
.code
drawhollow proc near
push si
push ax
push cx
push dx
mov dx,[si+1]
mov cx,[si]
mov al,1
lp1:
mov ah,0ch
int 10h
inc cx
cmp cx,[si+2]
jle lp1 ;用emu8086跟踪到此处时就发生除法溢出
lp2:
mov ah,0ch
int 10h
inc dx
cmp dx,[si+3]
jle lp2
lp3:
mov ah,0ch
int 10h
dec cx
cmp dx,[si]
jge lp3
lp4:
mov ah,0ch
int 10h
dec dx
cmp dx,[si+2]
jge lp4
pop dx
pop cx
pop ax
pop si
ret
drawhollow endp
drawsolid proc near
push si
push ax
push cx
push dx
mov ah,0ch
mov dx,[si+1]
mov cx,[si]
mov al,1
re1:
mov ah,0ch
int 10h
re2:
mov ah,0ch
int 10h
inc cx
cmp cx,[si+2]
jle re2
mov cx,[si]
inc dx
cmp dx,[si+3]
jle re1
pop dx
pop cx
pop ax
pop si
ret
drawsolid endp
.startup
mov ax,@data
mov es,ax
mov ax,0013h
int 10h
lea si,drawhollow
call hollow
lea si,drawsolid
call solid
.exit 0
end
[解决办法]
起始和那个没直接关系的. 你自己看吧, 注释符后有 '* ' 的是改动过的:
.model small
.stack
.data
hollow dw 20d,20d,100d,70d
solid dw 60d,45d,140d,95d
x1 dw ?
y1 dw ?
x2 dw ?
y2 dw ?
.code
drawhollow proc near
push si
push ax
push cx
push dx
mov dx,[si+2] ;*
mov cx,[si]
mov al,1
lp1:
mov ah,0ch
int 10h
inc cx
cmp cx,[si+4] ;*
jle lp1 ;用emu8086跟踪到此处时就发生除法溢出
lp2:
mov ah,0ch
int 10h
inc dx
cmp dx,[si+6] ;*
jle lp2
lp3:
mov ah,0ch
int 10h
dec cx
cmp cx,[si] ;*
jge lp3
lp4:
mov ah,0ch
int 10h
dec dx
cmp dx,[si+2] ;*
jge lp4
pop dx
pop cx
pop ax
pop si
ret
drawhollow endp
drawsolid proc near
push si
push ax
push cx
push dx
mov ah,0ch
mov dx,[si+2] ;*
mov cx,[si]
mov al,2 ;* 不同颜色以示区别
re1:
mov ah,0ch
int 10h
re2:
mov ah,0ch
int 10h
inc cx
cmp cx,[si+4] ;*
jle re2
mov cx,[si]
inc dx
cmp dx,[si+6] ;*
jle re1
pop dx
pop cx
pop ax
pop si
ret
drawsolid endp
.startup
mov ax,@data
mov es,ax
mov ax,0013h
int 10h
mov ah, 0fh :*
int 10h ;* 主要是获得当前的 Display Page
lea si,hollow ;* drawhollow
call drawhollow ;* hollow
lea si,solid ;* drawsolid
call drawsolid ;* solid
.exit 0
end
当然了, 那些数值应该是无符号数, 所以采用 ja/jb 组合可能更合理, 虽然由于值比较小, 使用 jg/jl 也没有表现出问题来