3

The Art of Computer Programming Volume 1, third edition一书中,我很难理解以下 MIX 汇编语言指令的含义:ENT1 *,它出现在本书的第 189 页。

(p.189) 例如,如果我们想让MAXNbe的调用序列

     JMP  MAXN
     CON  n

那么子程序可以写成如下:

MAXN STJ  *+1
     ENT1 *

到目前为止我发现的是以下行

MAXN STJ  *+1

将存储常量的内存地址n存储到存储指令的内存位置的 [0:2] 字段中ENT1 *

因此,我在这里猜测以下行

     ENT1 *

应该将存储指令的内存位置的 [0:2] 字段的值加载ENT1 *到 register I1

*但是,如教科书所述,星号()的含义是:

(p.146) 星号(读作“self”)指的是它出现的行的位置。

那么,不应该 ENT1 *只将存储指令的内存位置的地址ENT1 *存储到寄存器I1吗?

4

1 回答 1

4

简答

我错过的一点是星号(*)是当前位置的值,只有在组装时才值得确认。由于 MIX 是一种修改指令本身的汇编语言,因此存储在I1寄存器中的值是在运行时确定的

所以在这种情况下,星号(*ENT1 *没有意义。甚至可以更改*任何值,因为存储在I1寄存器中的值将由前一条指令确定STJ *+1

使用 MIX Builder 进行验证

我已经在从此处MIX Builder下载的 Windows 10 上组装了以下 MIX 汇编语言代码。

      ORIG 3000
BEGIN JMP  MAXN
      CON  100
MAXN  STJ  *+1
      ENT1 *
      LD3  0,1
      HLT
      END  BEGIN

组装后的结果是:

在此处输入图像描述

我们可以检查第 5 行中的指令ENT1 *是否将当前内存位置3003存储在 [0:2] 字段中。

执行第 4 行后,第 5 行的 [0:2] 字段变为3001,即存储常量的内存位置100

在此处输入图像描述

因此,在执行第 5 行之后,值3001(not 3003) 将存储在I1寄存器中:

在此处输入图像描述

请注意,将字节值46和寄存器57中的值组合在一起会产生,即它们是基数 64 值。I13001(= 46 * 64 + 57)

于 2018-06-20T01:55:44.567 回答