1

我正在阅读 Knuth 的The Art of Computer Programming,我对 MIX 汇编语言有疑问,尤其是 DIV 运算符。

在第 133 页,他给出了一个示例,说明 DIV 运算符如何影响累加器和扩展寄存器,给定这些寄存器的特定状态,以及输入存储单元。这篇 Stack Overflow 帖子描述了这个问题(我想也回答了这个问题):MIX 中的除法如何工作?

我的问题是回答的人使用我不明白的方法将存储在 rAX(寄存器 A 和 X)中的 10 字节字的值转换为一个数字:

如果您手动进行除法,通过将字节转换为单个数字,您将得到 -210,501,825(如果您使用的是最小的字节 - 在 Knuths 书中是 6 位(!))

有人可以指导我完成这种转换吗?

谢谢,山姆

4

1 回答 1

2

这取决于您使用的字节大小。Knuth 故意不定义字节的底层实现——每个字节可以支持 64 到 100 个底层值,但最小值是 64,这似乎是大多数实现所使用的。

假设每个字节包含 64 个值,并假设您在 rA 中有以下寄存器内容:

+ 01 02 03 04 05

最低有效字节在右侧。因此,整个 rA 寄存器的“整体”值将是:

= (1 * 64^4) + (2 * 64^3) + (3 * 64^2) + (4 * 64^1) + (5 * 64^0)
= (1 * 16777216) + (2 * 262144) + (3 * 4096) + (4 * 64) + (5 * 1)
= 17314053

这正是 GNU MDK 将为您提供的:

MIX> weval 1(1:1),2(2:2),3(3:3),4(4:4),5(5:5)
+ 01 02 03 04 05 (0017314053)

对于 rAX(rA 和 rX 被视为一个寄存器),这是相同的想法,除了将 rA 放在 rX 的左侧。因此,如果您有:

rA = + 01 02 03 04 05
rX = + 06 07 08 09 10

总价值为:

(1 * 64^9) + (2 * 64^8) + (3 * 64^7) + (4 * 64^6) + (5 * 64^5) +
(6 * 64^4) + (7 * 64^3) + (8 * 64^2) + (9 * 64^1) + (10 * 64^0)

对于十进制实现,您只需使用 100 而不是 64 作为基数。所以在最初的例子中,你最终会得到:

= (1 * 100^4) + (2 * 100^3) + (3 * 100^2) + (4 * 100^1) + (5 * 100^0)
= 102030405

希望有帮助。

于 2016-08-31T01:39:24.983 回答