Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly “是什么意思?”;ENT1*”;在TAOCP混合汇编语言中?_Assembly_Knuth_Taocp - Fatal编程技术网

Assembly “是什么意思?”;ENT1*”;在TAOCP混合汇编语言中?

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

在《计算机编程的艺术》第1卷第三版中,我很难理解以下混合汇编语言指令的含义:
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机器)取代它)