TAOCP MIX汇编语言中"ENT1 *"是什么意思?

What is the meaning of "ENT1 *" in TAOCP MIX assembly language?

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

(p.189) For example, if we wanted to make the calling sequence for MAXN be

     JMP  MAXN
     CON  n

then the subroutine could be written as follows:

MAXN STJ  *+1
     ENT1 *

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

MAXN STJ  *+1

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

因此,我猜测下面这行

     ENT1 *

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

但是,星号(*)的含义在课本上是这样写的:

(p.146) An asterisk (read "self") refers to the location of the line on which it appears.

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

简答

我错过的一点是,作为当前位置值的星号 (*) 仅在 组装 时才值得确认。由于 MIX 是一种 修改指令本身的汇编语言 存储在 I1 寄存器中的值在 run-time.

所以在这种情况下,ENT1 *中的星号(*)没有任何意义。甚至可以将 * 更改为 任何 值,因为存储在 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

组装后结果为:

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

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

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

请注意,在 I1 寄存器中组合字节值 4657 会产生 3001(= 46 * 64 + 57),即它们是 base 64 值。