在《计算机编程的艺术,第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
的存储位置的地址吗?
答案 0 :(得分:3)
我想念的是,星号(*
)是当前位置的值,只有在组装时才值得确认。由于MIX是一种可自行修改指令本身的汇编语言,因此在运行时确定存储在I1
寄存器中的值。
因此,在这种情况下,*
中的星号(ENT1 *
)没有意义。甚至可以将*
更改为 any 值,因为存储在I1
寄存器中的值将由上一条指令STJ *+1
确定。
我已在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 *
中的指令是否在[0:2]字段中存储了当前的存储位置3003
。
执行第4行后,第5行的[0:2]字段将更改为3001
,即存储常量100
的存储位置:
因此,在执行第5行之后,值3001
(而非3003
)将存储在I1
寄存器中:
请注意,将46
寄存器中的字节值57
和I1
组合在一起将得到3001(= 46 * 64 + 57)
,即它们是基数64的值。