assembly - LDA、STA、SUB、ADD、MUL 和 DIV 运算在 Knuth 的机器语言 MIX 中如何工作?

标签 assembly knuth taocp

我一直在阅读 Donald Knuth 所著的《计算机编程艺术》第一卷。现在我完成了第一部分,其中解释了所有数学知识,我很高兴。不幸的是,在p。 121 他开始根据真实的机器语言解释这种名为 MIX 的虚构机器语言,随后他将解释所有算法,Knuth 先生完全迷失了我。

我希望这里有人能“讲”一点 MIX 并能帮助我理解它。具体来说,他开始解释不同的操作并展示示例(第 125 页起),让我迷失了方向。

Knuth 使用以下形式的“指令格式”:

Picture 1

他还解释了不同字节的含义:

Picture 2

因此,正确的字节是要执行的操作(例如,LDA“加载寄存器 A”)。 F 字节是对具有 8L + R 字段规范 (L:R) 的操作代码的修改(例如,C=8 和 F=11 产生“使用 (1:3) 字段加载 A 寄存器)。然后 +/- AA 是地址,I 是修改地址的索引规范。

嗯,这对我来说有点意义。但随后高德纳举了一些例子。第一个我确实理解,除了一些位之外,但我无法理解第二个示例的最后三个,并且对下面示例 3 中更困难的操作一无所知。

这是第一个示例:

Picture 3

LDA 2000 只是加载完整的单词,我们在寄存器 A rA 中看到它的完整内容。第二个 LDA 2000(1:5) 加载从第二位(索引 1 )到末尾(索引 5)的所有内容,这就是加载除加号之外的所有内容的原因。第三个使用 LDA 2000(3:5) 只加载从第三个字节到最后一个字节的所有内容。另外,LDA 2000(0:3)(第四个示例)也有一定道理。应复制 -803,并取 - 并将 80 和 3 放在末尾。

到目前为止一切顺利,在 number5 中,如果我们遵循相同的逻辑,LDA2000(4:4) 它只传输第四个字节。它确实做到了最后一个位置。但是,在LDA 2000(1:1)中,只应复制第一个字节(符号)。这很奇怪。为什么第一个值是+而不是-(我期望只复制-)。为什么其他值都是0,最后一个是问号?

然后他给出了第二个示例,其中包含操作 STA(商店 A):

Picture 4

同样,STA 2000STA 2000(1:5)STA 2000(5:5) 具有相同的逻辑。然而,Knuth 执行了 STA 2000(2:2)。您可能希望复制第二个字节,该字节等于寄存器 A 中的 7。但是不知何故,我们最终得到 - 1 0 3 4 5。我已经研究了几个小时,但不知道这是怎么回事,也不知道这个例子之后的两个例子(STA 2000(2:3)STA 2000(0:1)) 可以导致显示该位置的内容。

我希望这里有人能够照亮这最后三个。

此外,我对他解释操作ADDSUBMULDIV的页面也遇到了很大的麻烦。第三个例子,参见

Picture 5

这第三个例子是我要理解的最终目标,现在它完全毫无意义。这非常令人沮丧,因为我确实想继续他的算法,但如果我不理解 MIX 我将无法理解其余的!

我希望这里有人上过关于 MIX 的类(class),或者看到了我没有看到的东西,并且愿意分享他或她的知识和见解!

最佳答案

该设计是 20 世纪 60 年代的产物,当时字节有 6 位,十进制计算很常见。机器必须与 10 位计算器竞争。必须强调的是,这是一个虚构的架构,实际实现它会很困难,因为字节没有固定的大小。 MIX 可以以二进制方式工作,其中一个字节存储 6 位,您将得到相当于 31 位机器的结果:1 位用于符号,5 x 6 位用于字节,组成一个。或者可以以十进制形式工作,其中一个字节存储两个数字(0..99)。这不适合 6 位 (0..63),强调了设计的虚构部分。

它确实具有当时机器的另一个共同特征,即内存只能寻址。或者换句话说,您无法像在所有现代处理器上那样对单个字节进行寻址。因此需要一个技巧来从单词中提取字节值,这就是 (first:last) 修饰符的作用。

从 0 到 5,从左到右对单词的各个部分进行编号。 0 是符号位,1 是 MSB(最高有效字节),5 是 LSB(最低有效字节)。最重要的细节是您必须移位字节,(first:last) 中的最后一个寻址字节成为目标中的 LSB。

所以最容易理解的是LDA 2000(0:5),复制所有内容,LDA 2000(1:5),复制除符号位之外的所有内容, LDA 2000(3:5) 复制 3 个字节,由于复制了 LSB,因此没有任何移位。只要 last 是 5,那么就没有什么特别的事情发生。

LDA 2000(0:0)也很容易理解,它只复制符号位,不复制任何字节。

LDA 2000(0:3) 是问题开始的地方。图片可能会有所帮助:

+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+
  |
  v
+---+---+---+---+---+---+
| 0 | x | x | 1 | 2 | 3 |
+---+---+---+---+---+---+

(0:3) 移动符号位和字节 #1 到 #3。请注意字节 #3 如何成为目标字中的最低有效字节。正是这种转变可能会引起困惑。

也许LDA 2000(4:4)现在也变得清晰了。仅复制一个单个字节,它成为目标中的LSB。 LDA 2000(1:1) 的配方相同,现在将字节 #1 移动到字节 #5。

关于assembly - LDA、STA、SUB、ADD、MUL 和 DIV 运算在 Knuth 的机器语言 MIX 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924244/

相关文章:

assembly - at&t 汇编语法从何而来?

Java:如何实现 Dancing Links 算法(使用 DoublyLinkedLists)?

algorithm - Knuth 计算机编程艺术 ex 1.1.8

algorithm - 关于出现在 TAOCP 卷一的 "Notes on the Exercises"中的练习

c++ - 在 x64 上获取没有 __asm 的 SSE 版本

iphone - 使用 NEON 指令进行图像阈值处理

symbols - 首字母缩略词或速记 "lg"是什么意思?

assembly - 如何通过BIOS中断在实模式下处理键盘?

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