【发布时间】:2015-09-24 16:18:59
【问题描述】:
我正在尝试执行简单的整数除法 (9/2=?),但 MIX 构建器会引发整数溢出错误。难道我做错了什么?代码如下:
ORIG 1000
START NOP
A CON 0
B CON 0
ENTA 2
STA A
ENTX 9
DIV A
STA A
HLT
END START
【问题讨论】:
-
在 MixEmul 上出现同样的错误...
我正在尝试执行简单的整数除法 (9/2=?),但 MIX 构建器会引发整数溢出错误。难道我做错了什么?代码如下:
ORIG 1000
START NOP
A CON 0
B CON 0
ENTA 2
STA A
ENTX 9
DIV A
STA A
HLT
END START
【问题讨论】:
那是因为 rA 不仅用于存储商,还被认为是被除数的一部分。如 TAOCP 第 1 卷第 131 页底部的 DIV 项目符号下所述:“rA 和 rX 的值,被视为带有 rA 符号的 10 字节数字 rAX,除以值 V。”它进一步指出:“如果 V = 0 或商的大小超过五个字节(这相当于 |rA| >= |V| 的条件),寄存器 A 和 X 将填充未定义的信息,并且溢出切换已打开。” 对于您的代码,rA 设置为 2,然后存储在从中获取除数(“V”)的地址。这意味着 rA == V,触发刚刚描述的条件。
我记得这一点的原因是,由于在 DIV 的情况下将 rA 和 rX 处理为 10 字节的数字,因此在 MixEmul 中实现此运算符非常痛苦。 :)
【讨论】:
解决办法是在DIV A前加ENTA 0(设置寄存器rA=0)。我真的不知道为什么你必须重置保存商的寄存器...
【讨论】: