9

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

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

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

图片1

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

图二

所以正确的字节是要执行的操作(例如,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 放在末尾。

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

然后他给出了操作的第二个例子STA(存储 A):

图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))如何导致显示的位置内容。

我希望这里有人能对这最后三个人大放光彩。

ADD此外,我对他解释操作、、、SUBMUL的页面也有很大的麻烦DIV。第三个例子,见

图5

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

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

4

3 回答 3

4

该设计是 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。

于 2014-01-05T14:31:59.693 回答
2

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

因此,如果我们有这样的内存位置 2000:

- 1 2 3 4 5

rA看起来像这样:

+ 6 7 8 9 0

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

- 1 0 3 4 5

因为 2 处和 2 处结束的字节在内存rA中被替换为从左边开始的值:0 STA 2000(3:3)。然后将离开内存位置 2000,如:- 1 2 0 4 5,并STA 2000(4:4)给我们- 1 2 3 0 5.

类似地,STA 2000(2:4)给我们- 1 8 9 0 5,用(2:4)3 个字节替换 2000 中的字节rA,从右边开始,rA向左计数,所以8 9 0of+ 6 7 8 9 0替换2 3 4- 1 2 3 4 5

这不是 Knuth 最清楚的时刻,但如果您仔细阅读他在您展示的页面上的解释,它确实可以清楚地说明这一点。

于 2015-11-20T23:05:10.617 回答
1

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

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)。在十进制中,每个字节有 2 个十进制数字(值范围从 0 到 99)。字节被组合成五个字节加上一个符号的字。大多数为 MIX 编写的程序都可以二进制或十进制运行,只要它们不尝试在单个字节中存储大于 63 的值。

于 2014-01-05T11:55:55.813 回答