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
寄存器中组合字节值 46
和 57
会产生 3001(= 46 * 64 + 57)
,即它们是 base 64 值。
在书 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
beJMP 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
寄存器中组合字节值 46
和 57
会产生 3001(= 46 * 64 + 57)
,即它们是 base 64 值。