8086汇编语言中的DIV指令溢出问题。(回答的好会加分)

MOVAX,0B64HMOVCX,0AHDIVCXDIVCXDIVCXDIVCX执行第一个DIV时还正常,AX=123H,DX=06H。但执行第二个DIV后AX=99B6... 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里的那个值,如何准确取得。
展开
 我来答
做而论道
高能答主

2022-12-24 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部

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 不为零,就绝对不会发生溢出。

日名字全被注册
2020-05-23 · TA获得超过482个赞
知道小有建树答主
回答量:787
采纳率:68%
帮助的人:164万
展开全部
十年前的问题,现在都不结。。
我还是补充一个正确解释吧。
首先你这个程序没有完整的初始化,
被除数如果是b64h,那么应该
MOV AX,b64h
XOR DX,DX
这样去设置被除数。
你的第一次DIV CX也许没问题,但这段算法也只能用在程序开始了,毕竟实际应用中这段代码之前还有很多流程,你并不能确保DX寄存器值为0,但第二次除,应该清掉原本存放着上次DIV余数的“第16~31位”,也就是DX寄存器,DIV指令在8086下是32位除16位。
所以第二次DIV之前,也应该加上XOR DX,DX清零被除数高16位。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
万世流香
2010-12-01 · TA获得超过429个赞
知道答主
回答量:195
采纳率:0%
帮助的人:212万
展开全部
字除法是(DX+AX)/(CX) 余数放DX ,除数放AX
第一次 DX为0 AX=B64/A=123H DX=B64/A=6H
第二次 DX为6H AX=(6123H)/A=9B6 DX=07H
第三次 DX为07H AX=(76123H)/A=BCE9 DX=9H
其它类似,要点:字除法要把DX和AX连着一起除。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-12-04
展开全部
c
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9045b38
2010-12-01 · TA获得超过1971个赞
知道小有建树答主
回答量:984
采纳率:90%
帮助的人:510万
展开全部
自己看每一步的运行结果:
C:\>DEBUG
-A
0B02:0100 MOV AX,0B64
0B02:0103 MOV CX,0A
0B02:0106 DIV CX
0B02:0108 DIV CX
0B02:010A DIV CX
0B02:010C DIV CX
0B02:010E
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B02 ES=0B02 SS=0B02 CS=0B02 IP=0100 NV UP EI PL NZ NA PO NC
0B02:0100 B8640B MOV AX,0B64
-P

AX=0B64 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B02 ES=0B02 SS=0B02 CS=0B02 IP=0103 NV UP EI PL NZ NA PO NC
0B02:0103 B90A00 MOV CX,000A
--P

AX=0B64 BX=0000 CX=000A DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B02 ES=0B02 SS=0B02 CS=0B02 IP=0106 NV UP EI PL NZ NA PO NC
0B02:0106 F7F1 DIV CX
-P

AX=0123 BX=0000 CX=000A DX=0006 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B02 ES=0B02 SS=0B02 CS=0B02 IP=0108 NV UP EI PL NZ NA PO NC
0B02:0108 F7F1 DIV CX
-P

AX=99B6 BX=0000 CX=000A DX=0007 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B02 ES=0B02 SS=0B02 CS=0B02 IP=010A NV UP EI PL NZ NA PO NC
0B02:010A F7F1 DIV CX
-P

AX=C292 BX=0000 CX=000A DX=0002 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B02 ES=0B02 SS=0B02 CS=0B02 IP=010C NV UP EI PL NZ NA PO NC
0B02:010C F7F1 DIV CX
-
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式