汇编语言中的除法溢出,请高手帮忙解决

assume cs:code,ds:date
date segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986'
db '1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,11430,1527,17800
date ends

table segment
db 21 dup('year summ ne ?? ')
table ends
code segment
start: mov ax,date
mov ds,ax
mov bx,0
mov ax,table
mov es,ax
mov di,0
mov si,0
mov cx,21
s: mov ax,ds:[bx]
mov es:[di],ax
mov ax,ds:[bx+2]
mov es:[di+2],ax
mov ax,ds:54H[bx]
mov es:[di+5],ax
mov ax,ds:54H[bx+2]
mov es:[di+7],ax
mov ax,ds:[si+0A8H]
mov es:[di+10],ax
mov ax,ds:[bx]
mov dx,ds:[bx+2]
div word ptr ds:[si+0A8H]
mov es:[si+14],ax
add bx,4
add si,2
add di,16
loop s
mov ax,4C00H
int 21H
code ends
end start
运行程序的时候说是除法溢出 搞不明白 为什么会溢出 请高手指点 谢谢了

用 DEBUG 跟踪你的程序,发现,溢出的原因,确实是这条除法指令。

不知道你为什么弄这么大的数字,来除以 3 !

这肯定是会溢出的。

-------------------------------

80x86 CPU 具有两种除法指令:16 位除以 8 位数、32 位除以 16 位数。

它们的商,分别是 8 位和 16 位数。

如果,参加运算的被除数较大,或除数较小,那么,商,就会超出预定的位数。

此时,你贸然使用除法指令,就要溢出了。

由此可知,CPU 自身的指令,有局限性,不要轻易的动用。
-------------------------------
为了避免溢出,执行除法指令之前,应该加以判断:

如果被除数的高位,小于除数,就不会发生“溢出”。

但是,最好,是你自己编写一个“不会溢出的”程序。

编程思路如下:

看懂了,就会发现,这程序其实也非常简单。

你自己动手编写,一定会成功的。

在图中,被除数是四个字节:1A 2B 3C 4D。

除以 BL 后,得到的商,也是四个字节。

按照图中的步骤,需要执行四次 DIV  BL。

只要 BL 不为零,就绝对不会发生溢出。

按此思路,被除数的字节数,可以继续增加,仅受制于内存的大小。

这就是说:被除数,可以认为是无限的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-16
楼主提完问题就不管了
第2个回答  2009-09-02
这个问题已经有人提过,请参见下方的参考资料。

参考资料:http://zhidao.baidu.com/question/107131814.html

本回答被提问者采纳
相似回答
大家正在搜