【问题标题】:How do the operations LDA, STA, SUB, ADD, MUL and DIV work in Knuth's machine language MIX?LDA、STA、SUB、ADD、MUL 和 DIV 操作如何在 Knuth 的机器语言 MIX 中工作?
【发布时间】:2014-01-04 17:29:56
【问题描述】:

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

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

Knuth 使用这种“指令格式”,形式如下:

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

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

嗯,这对我来说有点道理。但随后 Knuth 举了一些例子。第一个我确实理解,除了几位,但我无法理解第二个示例的最后三个,下面的示例 3 中更困难的操作完全没有。

这是第一个例子:

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

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

然后他给出了第二个例子,操作STA(商店A):

同样,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 的页面上也遇到了很大问题。第三个例子,见

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

我希望这里有人上过MIX 的课程,或者看到了我看不到的东西并愿意分享他或她的知识和见解!

【问题讨论】:

  • 我的 Knuth 副本目前在船上的集装箱中,但 here 带有 MIX 的维基百科页面,here 是您可以查看的模拟器。
  • 感谢我已阅读该页面,但遗憾的是它没有对语言操作本身进行解释。我找到了一个在线 MIX 模拟器here
  • 我在 1969 年从 Knuth 的第 1 卷中学习了数据结构,但从未了解 MIX 汇编代码;他确实提供了独立于 MIX 的代码。恕我直言,它并没有对我造成明显的伤害,并且已经为我服务了 40 多年(我已经使用他描述的算法进行了很多汇编编码)。我希望你得到一个好的答案,但你不需要它来欣赏他的表达的美丽和直觉。

标签: assembly knuth taocp


【解决方案1】:

该设计是 1960 年代的产物,那时字节有 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。

【讨论】:

  • 感谢您的回答!您对 MSB 和 LSB 的解释确实更清楚。但我仍然没有在image 4 中看到它。你能解释一下这张图片中`STA 2000(2:2)STA 2000(2:3)STA 2000(0:1)的结果吗?
  • 它只是反过来工作,将 LSB 存储到 (:last)。
  • 我们在某个位置有- 1 2 3 4 5,而寄存器A 有+ 6 7 8 9 0。然后当我们执行STA 2000(2:2) 时,最低有效字节(0)存储在第二个位置。好的!而在STA 2000(2:3) 中,第二个和第三个字节(7 和 8)存储在最低有效字节中,得到- 1 9 0 1 4 5。哈不错。对于STA 2000(0:1),A 的最低有效字节(0)存储在第一个位置并获得+ 0 2 3 4 5。好的!我现在可以看到它来自哪里!我仍然不明白SUBADDMULDIVs。也许你可以这么好心解释一下?
【解决方案2】:

这是使 Knuth 的 MIX 计算机的存储操作有意义的另一种方法。在像STA 2000(a:b) 这样的存储操作中,字段规范(a:b) 不是指寄存器中的字节,而是指内存位置 中的字节。它说将数据存储在内存位置 2000 的 rA 中,从 2000 年的 a 开始,到 2000 年的 b 结束。然后它只占用 rA 中必要的字节,从 right em> 并将它们存储在 2000 年。

所以如果我们有这样的内存位置 2000:

- 1 2 3 4 5

rA 看起来像这样:

+ 6 7 8 9 0

然后我们执行STA 2000(2:2)结果是

- 1 0 3 4 5

因为 memory 中 2 处和 2 处结束的字节被替换为 rA 中从左侧开始的值:0。STA 2000(3:3) 将离开内存位置 2000,例如:@987654334 @ 和 STA 2000(4:4) 会给我们- 1 2 3 0 5

同样,STA 2000(2:4) 给了我们- 1 8 9 0 5,将 2000 年的字节 (2:4) 替换为来自 rA 的 3 个字节,从 rA 的右侧开始向左计数,所以 8 9 0 的 @987654343 @ 替换 2 3 4- 1 2 3 4 5

这不是 Knuth 最清楚的时刻,但如果您仔细阅读他在您展示的页面上的解释,就会清楚这一点。

【讨论】:

  • 非常感谢。你的答案终于让我明白了。
【解决方案3】:

关于加载和存储:似乎符号进入符号,如果包含,而字段规范中的其余字节进入/来自寄存器的最低字节。字段 sped 描述了内存中的字段,而不是寄存器中的字段。

STA 2000(2:2)。您希望复制第二个字节 在寄存器 A 中等于 7。但是不知何故,我们最终得到 - 1 0 3 4 5.

这里从2到2(长度为1字节)的内存字节由寄存器的最低一个(长度)字节写入。

请注意,符号不是普通的“字节”,因此在加载字段时,0 进入符号而不是最低字节,就像其他字节一样。将字段 0 视为符号而不考虑其位置可能是个好主意。

STA 2000(0:1) 将数据存储在内存字段 0 和 1:即符号位(内存字段 0)和从寄存器到内存字段 1 的最低字节。

当谈到算术时,请注意架构不是面向普通字节的,而是面向数字的。第一个示例(添加)看起来使用十进制模式,或者解释使用十进制表示法。不确定是哪个。

来自维基百科(“500 - 内部服务器错误”链接):

MIX 是一种混合二进制-十进制计算机。当以二进制编程时, 每个字节有 6 位(值范围从 0 到 63)。在十进制中,每个 byte 有 2 个十进制数字(值范围从 0 到 99)。字节是 组合成五个字节加一个符号的字。大多数程序编写 for MIX 将以二进制或十进制工作,只要它们不 尝试在单个字节中存储大于 63 的值。

【讨论】:

  • 谢谢 我现在明白你的回答了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多