如何操作LDA,STA,SUB,ADD,MUL和DIV在Knuth的机器语言MIX中工作?

时间:2014-01-04 17:29:56

标签: assembly mix knuth

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

我希望这里的某个人能够“说话”MIX并帮助我理解它。具体来说,他失去了我开始解释不同操作和展示例子的地方(第125页)。

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

Picture 1

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

Picture 2

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

这对我来说有点道理。但是Knuth带来了一些例子。第一个我理解除了几个位,但我无法绕过第二个例子的最后三个,而且根本不是下面例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找到一门课程,或者看到一些我看不到的东西,并愿意分享他或她的知识和见解!

3 个答案:

答案 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 5STA 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的值。