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

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

本回答被提问者采纳

汇编语言中的除法溢出,请高手帮忙解决
80x86 CPU 具有两种除法指令:16 位除以 8 位数、32 位除以 16 位数。它们的商,分别是 8 位和 16 位数。如果,参加运算的被除数较大,或除数较小,那么,商,就会超出预定的位数。此时,你贸然使用除法指令,就要溢出了。由此可知,CPU 自身的指令,有局限性,不要轻易的动用。---为了避免溢...

急求汇编程序的错误,系统提示除法溢出,求指点!!!
首先说你程序中的错误:保存0号中断向量和恢复0号中断向量的时候没有对应。。。然后就是编写中断的时候应该保存各个用到的寄存器。这样在回到程序的时候才不会对原来的程序产生影响。然后就是除法溢出的时候,进中断保存的返回地址是div处的地址,也就是你执行完除法溢出中断返回的还是div,此处仍是除法溢...

汇编除法溢出解决办法的问题
一般来说,在执行 DIV 指令之前,应该加以判断,以避免溢出。较好的方法是:编写一个“不会溢出”的除法程序。方法思路如下:在右图中,被除数是:1A2B3C4DH,有 32 位数。除数是:BL,仅有 8 位数。商,是:32 位数。按照图中的步骤,只要 BL 不为零,就绝对不会发生溢出。

汇编语言 除法出错
较好的方法是:编写一个“不会溢出”的除法程序。方法思路如下:左图是 CPU 执行 16 位数除以 8 位数时的操作。在右图中,被除数:1A 2B 3C 4DH,有 32 位数。除数是:BL,仅有 8 位数。商,是:32 位数。按照图中的步骤,需要执行四次 DIV BL。只要 BL 不为零,就绝对不会发生溢出。按...

masm,,8086汇编语言 显示divide overflow,,,麻烦懂的帮我看下, 小白...
,--不匹配 DIV BX PUSH AH---对吗?INC COUNT MOV AX,AL---什么指令?CMP AX,0 JNZ L1 L2:POP BX DEC COUNT MOV AH,BX---对吗? 这句,能通过编译?INT 21H CMP COUNT,0 JNZ L2 ……这程序,根本就不能运行。楼主怎么会看到:divide overflow,,,?真奇怪。

汇编语言王爽第三版248页除法溢出(0号中断)的中断程序结尾处为什么不...
本中断处理的是溢出错误。进入中断说明程序发生了问题,是不能返回主程序继续允许的

王爽编的《汇编语言》第八章实验 调试时候出现 divide overflow_百 ...
做div的时候如果是8为除法,被除数应该是在AX中,16为除法,被除数高位应该在DX,地位在AX中,你看你上面的代码,你是低位在Dx中,高位在ax中,弄反过来了,改成mov dx,cs:[bx+7],mov ax,cs:[bx+5]就可以了 我调试过了,你的程序只要改这2个地方就能够正常得到预期答案了.附上我自己以前写...

汇编语言中如遇到两个dword型的数值相加,指令怎么写 我写了 add dword...
你应该用它们,编写出来“不会溢出”的除法程序。方法思路如下:左图,是 CPU 执行 16 位数除以 8 位数时的操作。下面,就用这最简单的除法指令,实现较大数字除法操作。在右图中,被除数有四个字节:1A 2B 3C 4DH,共有 32 位数。除数,是一个字节:BL,仅有 8 位数。很多学习汇编语言的人,...

用8086汇编语言实现两个无符号32位二进制数相加,并显示结果。注:输入...
; 相加的两个数以及其和不得超过6.5亿,否则出现除法溢出; 输入的两个数存入数组x 中 (输入时,两个数以空格间隔,以回车结束输入); 相加的结果存入y 中,或dx、ax中code segment assume cs:code org 100hSTART: JMP BBBX DD 10 dup(?)num dw ?Y DD ?cc db ...

求助 汇编语言 32位*32位 二进制数怎么做乘法??高手帮忙啊~
2、以下是加、减、乘、除的4个子程序 ;;32位运算 ;;=== ;32位符号数的加法运算 ;入: DXAX=32位操作数1 ; CXBX=32位操作数2 ;出: DXAX=两操作数的和 ; OF=1: 溢出 ; OF=0: 正常 ;=== subn_add32 proc near add ax,bx adc dx,cx ret subn_add32 endp ;=== ;32位符...

相似回答
大家正在搜