MOV AX,0B64H
MOV CX,0AH
DIV CX
DIV CX
DIV CX
DIV CX
执行第一个DIV时还正常,AX=123H, DX=06H。但执行第二个DIV后AX=99B6,DX=07H;但实际上应为AX=1DH,DX=01H啊。
求解原因与解决办法,我需要每一步DIV所取出的余数值,就是DX里的那个值,如何准确取得。
DIV CX!
CPU 的计算是:DX:AX / CX = AX ... DX。
这是“32 位数除以 16 位数”。 商、余数,都是 16 位数。
你的程序,没有对 DX 进行初始化,你就执行了多次 DIV CX!
结果,难以预料。
如果,被除数较大,或除数较小,都可能使“商”超出 16 位数,此时,就会溢出。
当除数为零时,必然会出现:Divide overflow。
此外,当被除数的高位,大于等于除数时,也会发生“溢出”。
直接使用 DIV 指令,有一定的风险,一不小心就溢出了。特别是数字不确定的时候。
一般来说,在执行 DIV 指令之前,应该加以判断,以免发生溢出。
-----------------------
较好的方法是:编写一个“不会溢出”的除法程序。
方法思路如下:
在右图中,
被除数:1A 2B 3C 4DH,有 32 位数。
除数是:BL,仅有 8 位数。
商,是:32 位数。
按照图中的步骤,需要执行四次 DIV BL。
只要 BL 不为零,就绝对不会发生溢出。