我正在学习 Knuth 的计算机编程艺术,并且我有一个关于 MIX 汇编语言的问题,特别是 DIV 运算符。
在第 133 页,他给出了一个示例,说明 DIV 运算符如何影响累加器和扩展寄存器(给定这些寄存器的特定状态)以及输入存储单元。这个问题在 Stack Overflow 帖子中进行了描述(我认为也得到了解答):How does division work in MIX?
我的问题是,回答者使用我不明白的方法将存储在 rAX(寄存器 A 和 X)中的 10 字节字的值转换为单个数字:
If you do the division by hand, by converting the bytes into a single number you will get -210,501,825 (if you're using the smallest kind of byte - which is 6 bits (!) in Knuths book)
有人可以引导我完成此转换吗?
谢谢, 山姆
最佳答案
这取决于您使用的字节大小。 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
总值(value)为:
(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
希望有帮助。
关于assembly - MIX DIV 运算符,以及打包字节数的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38982001/