混合DIV操作符,并转换打包字节数



我正在阅读Knuth的计算机编程艺术,我有一个关于MIX汇编语言的问题,特别是div操作符。

在第133页,他给出了DIV操作符如何影响累加器和扩展寄存器(给定这些寄存器的特定状态)和输入内存单元的示例。这个问题在Stack Overflow的帖子中被描述(并且回答了,我想):在MIX中除法是如何工作的?

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

如果你手工做除法,通过将字节转换成单个你会得到-210,501,825(如果你用的是最小的byte -在knuth的书中是6位(!)

谁能给我讲讲这个转换?

谢谢,山姆

这取决于您使用的字节大小。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

希望对你有帮助。

最新更新