在第三版“计算机编程艺术”()一书中,我很难理解以下混合汇编语言指令的含义:ENT1 *,它出现在该书的第189页。
(p.189)例如,如果我们想使
MAXN的调用序列成为 JMP MAXN CON n 然后,可以将子例程编写如下: MAXN STJ *+1 ENT1 *
到目前为止,我发现的是下面这一行
MAXN STJ *+1将常量n存储的内存地址存储到存储指令ENT1 *的内存位置的0:2字段。
因此,我猜想下面的一行
ENT1 *应该加载存储指令ENT1 *以注册I1的内存位置的0:2字段的值。
然而,正如教科书中所述,星号(*)的含义是:
(p.146)星号(读为"self")指其出现的行的位置。
因此,ENT1 *不应该仅仅存储存储指令ENT1 *以注册I1的内存位置的地址吗?
发布于 2018-06-20 01:55:44
简短回答
我忽略的一点是,星号(*)是当前位置的值,只有在组装时才值得确认。由于MIX是一种修改指令本身的汇编语言,所以I1 寄存器中存储的值将在运行时中确定。
因此,在这种情况下,星号(*)在ENT1 *中没有任何意义。甚至可以将*更改为任何值,因为存储在I1寄存器中的值将由前面的指令:STJ *+1确定。
用混合生成器进行验证
我已经将以下混合汇编语言代码与从MIX Builder下载的这里 10上的Windows 10汇编语言代码组装在一起。
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的内存位置:

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

请注意,将46和57字节值组合在I1寄存器中将导致3001(= 46 * 64 + 57),即它们是基本64值。
https://stackoverflow.com/questions/50938553
复制相似问题