Assembly “是什么意思?”;ENT1*”;在TAOCP混合汇编语言中?
在《计算机编程的艺术》第1卷第三版中,我很难理解以下混合汇编语言指令的含义:Assembly “是什么意思?”;ENT1*”;在TAOCP混合汇编语言中?,assembly,knuth,taocp,Assembly,Knuth,Taocp,在《计算机编程的艺术》第1卷第三版中,我很难理解以下混合汇编语言指令的含义:ENT1*,该指令出现在本书第189页 (p.189)例如,如果我们想使MAXN的调用序列 JMP MAXN CON n 然后,子例程可以编写如下: MAXN STJ *+1 ENT1 * 到目前为止,我发现以下几行 MAXN STJ *+1 ENT1 * 将存储常数n的内存地址存储到存储指令ENT1*的内存位置的[0:2]字段中 因此,我猜下面这行 MAXN ST
ENT1*
,该指令出现在本书第189页
(p.189)例如,如果我们想使MAXN的调用序列
JMP MAXN
CON n
然后,子例程可以编写如下:
MAXN STJ *+1
ENT1 *
到目前为止,我发现以下几行
MAXN STJ *+1
ENT1 *
将存储常数n
的内存地址存储到存储指令ENT1*
的内存位置的[0:2]字段中
因此,我猜下面这行
MAXN STJ *+1
ENT1 *
应该加载存储指令ENT1*
的内存位置[0:2]字段的值,以注册I1
然而,如本手册所述,星号(*
)的含义是:
(第146页)星号(读作“self”)是指它出现的行的位置
因此,不应该只存储存储指令ENT1*
的内存位置的地址,以注册I1
?简短回答
我遗漏的一点是,星号(*
)是当前位置的值,只有在组装时才值得确认。由于MIX是一种修改指令本身的汇编语言,存储在I1
寄存器中的值在运行时确定
因此在本例中,ENT1*
中的星号(*
)没有任何意义。甚至可以将*
更改为任何值,因为存储在I1
寄存器中的值将由前面的指令确定:STJ*+1
使用mixbuilder进行验证
我已使用从下载的Windows 10上的mixbuilder
汇编了以下混合汇编语言代码
组装后,结果是:
我们可以检查第5行ENT1*
中的指令是否在[0:2]字段中存储了当前内存位置3003
执行第4行后,第5行的[0:2]字段变为3001
,存储常量100
的内存位置:
因此,在执行第5行之后,值3001
(不是3003
)将存储在I1
寄存器中:
请注意,将I1
寄存器中的字节值46
和57
组合在一起,会产生3001(=46*64+57)
,即它们是基64值。您是否尝试过将其与mixal
组合并查看机器代码的十六进制转储?我不知道,但我很好奇。我在上找到了ENTi
文档。(这种混合使用6位字节和5位字节的字…很有趣。难怪Knuth用MMIX(RISC机器)取代它)