我一直在阅读Donald Knuth第1卷的计算机程序设计艺术。现在我完成了第一部分所有数学解释并且非常愉快。不幸的是,在p。 121他开始根据真实的机器语言解释这种名为MIX
的虚构机器语言,随后他将解释所有算法,Knuth先生完全失去了我。
我希望这里的某个人能够“说话”MIX
并帮助我理解它。具体来说,他失去了我开始解释不同操作和展示例子的地方(第125页)。
Knuth使用以下形式的“指令格式”:
他还解释了不同字节的含义:
因此,右字节是要执行的操作(例如,LDA
“加载寄存器A”)。 F字节是操作代码的修改,具有8L + R的字段规范(L:R)(例如,C = 8且F = 11产生“加载具有(1:3)字段的寄存器)。然后+/- AA是地址,我是修改地址的索引规范。
这对我来说有点道理。但是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):
同样,STA 2000
,STA 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
,SUB
,MUL
和DIV
。第三个例子,见
这第三个例子是我理解的最终目标,现在它完全没有任何意义。这是非常令人沮丧的,因为我想继续他的算法,但如果我不理解MIX
我将无法理解其余的!
我希望有人在MIX
找到一门课程,或者看到一些我看不到的东西,并愿意分享他或她的知识和见解!
答案 0 :(得分:4)
该设计是20世纪60年代的一个孩子,当字节有6位并且十进制计算很常见时。机器必须与10位数的计算器竞争。必须强调的是,这是一个虚构的架构,实际实现它将很困难,因为一个字节没有固定的大小。 MIX可以工作在二进制,其中一个字节存储6位,你将得到相当于一个31位的机器:符号为1位,字节为5 x 6位组成字。或者可以在十进制中工作,其中一个字节存储两个数字(0..99)。这不适合6位(0..63),强调设计的虚构部分。
它确实分享了当时机器的另一个共同特征,内存只有 word 可寻址。或者换句话说,您无法在所有现代处理器上寻址单个字节。因此需要一个技巧来提升单词中的字节值,这就是(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。
答案 1 :(得分:2)
这是使Knuth的MIX计算机的存储操作有意义的另一种方法。在像STA 2000(a:b)
这样的存储操作中,字段规范(a:b)
不是指寄存器中的字节,而是存储单元中的字节。它表示将数据存储在rA
的内存位置2000中,从2000年的a
开始,到2000年的b
结束。然后它只占用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)
中的字节rA
替换为来自rA
的3个字节,从8 9 0
中的右侧开始计数到在左侧,+ 6 7 8 9 0
的{{1}}取代了2 3 4
的{{1}}。
这不是Knuth最清晰的时刻,但是如果你仔细阅读了你所展示的页面上的解释,那么它确实清楚了。
答案 2 :(得分: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的最低字节。
当谈到算术时,请注意该体系结构不是面向字节的正常,而是面向数字的。第一个示例(add)看起来像是使用十进制模式,或者解释使用十进制表示法。不确定是哪一个。
来自维基百科(链接“500 - 内部服务器错误”):
MIX是混合二进制十进制计算机。以二进制编程时, 每个字节有6位(值范围从0到63)。十进制,每个 byte有2个十进制数字(值范围从0到99)。字节是 分为五个字节加一个符号的单词。大多数程序都写好 对于MIX,可以使用二进制或十进制,只要它们不工作 尝试在单个字节中存储大于63的值。