TAOCP MIX汇编语言中的“ ENT1 *”是什么意思?

时间:2018-06-20 00:19:37

标签: assembly knuth taocp

在《计算机编程的艺术,第1卷,第三版》 一书中,我很难理解下面的MIX汇编语言指令:ENT1 *的含义。在书的第189页上。

  

(p.189)例如,如果我们要使MAXN的调用顺序为

     JMP  MAXN
     CON  n
     

然后该子例程可以编写如下:

MAXN STJ  *+1
     ENT1 *

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

MAXN STJ  *+1

将存储常数n的存储器的地址存储到存储指令ENT1 *的存储器位置的[0:2]字段。

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

     ENT1 *

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

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

  

(p.146)星号(读作“ self”)是指其所在行的位置。

因此,ENT1 *不应仅存储指令ENT1 *到寄存器I1的存储位置的地址吗?

1 个答案:

答案 0 :(得分:3)

简短回答

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

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

使用MIX Builder进行验证

我已在here下载的Windows 10上用MIX Builder汇编了以下MIX汇编语言代码。

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

组装后,结果为:

enter image description here

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

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

enter image description here

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

enter image description here

请注意,将46寄存器中的字节值57I1组合在一起将得到3001(= 46 * 64 + 57),即它们是基数64的值。