assembly - MIX 中的除法是如何进行的?

标签 assembly division knuth taocp

有人可以向我解释一下 MIX 中的除法(来自 Knuth 的 TAOCP)是如何在字节到字节的基础上工作的吗?

rA = |-| . . . .0| 

rX = |+|1235|0|3|1|

内存位置 1000 包含 |-|0|0|0|2|0|

当你执行操作时

DIV 1000

寄存器变为

rA = |+|0|617|?|?|

rX = |-|0|0|0|?|1|

现在我明白了rArX上的符号,但是rAX的字节按什么顺序填充以及进行了哪些划分?

如果 DIV 1000 导致每一位除以 2,那么我期望

rAX = |+|617|0|1|0|-|0|1|0|1|1| 

其中rA包含除法结果,rX包含余数(从右侧填充)。

我可能在这里遗漏了一些东西,Knuth 似乎认为我应该能够自己弄清楚(因此有关于它的 10 级问题,我也没有得到),但是有人可以帮助我吗? ?

最佳答案

所以我自己想通了。

如果您手动进行除法,通过将字节转换为单个数字,您将得到 -210,501,825(如果您使用的是最小类型的字节 - 在 Knuth 的书中为 6 位(!))。将此值除以 -128,即使用相同字节大小的位置 1000 中的值。

商为 1644545,余数为 65,由于两个数均为负数,因此符号为正数。如果您将 1644545 存储在 rA 中,将 65 存储在 rX 中,您将得到

|+|0|6|17|32|01|
|-|0|0|0|1|1|

使用最小字节大小(可容纳 64 个数字)。由于 Knuth 在他的示例中从未假设特定的字节大小,因此 rX 有许多问号。 rX 的符号始终是 rA 的前一个符号。

编辑:我使用了非常方便的 MixEmul使用 MIX 寄存器的实用程序。这是在 .NET 中完成的一个非常好的 MIX 实现

关于assembly - MIX 中的除法是如何进行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/768948/

相关文章:

assembly - 如何在汇编语言编程中提示用户输入字符串并再次显示

gcc - 为什么gcc "start"函数(在main之前)中有无意义的asm代码?

html - 如何使这两个元素并排

c++ - 验证 Knuth 洗牌算法是否尽可能公正

c - 使用 IMUL 指令将数组中的值相乘会产生不正确的值

python - 无限除以 2

html - 不透明度的 CSS 亮度

literate-programming - 在 Windows 中读取 CWEB 格式的代码的最佳方式是什么?

卷积函数延迟瓶颈