assembly - MIX DIV 运算符,以及打包字节数的转换

标签 assembly knuth taocp

我正在学习 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/

相关文章:

java - 需要帮助分析 Java 崩溃

assembly - 如何完全挂起处理器?

assembly - MIX 减法如何处理 "packed"字

c - 为什么mulss在Haswell上只需要3个周期,而不是Agner的指令表? (使用多个累加器展开FP循环)

string-matching - KMP失效函数计算

c++ - Knuth 置换算法奇怪的行为

c++ - 使用 Dancing Links 精确覆盖

mysql - 如何理解mysql的gen_lex_hash.cc的算法?

taocp - 打印寄存器中包含的数字

c - 在程序集或注册表中看到的指针