首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

使用JGE/JLE引发除法溢出异常的有关问题

2012-03-11 
使用JGE/JLE引发除法溢出错误的问题我最近编写一个程序画矩形,其中包含一些条件转移语句,可是执行到那里的

使用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 也没有表现出问题来

热点排行