【问题标题】:What is the meaning of "ENT1 *" in TAOCP MIX assembly language?TAOCP MIX 汇编语言中的“ENT1 *”是什么意思?
【发布时间】:2018-06-20 00:19:36
【问题描述】:

计算机编程的艺术第 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 中吗?

【问题讨论】:

  • 你试过用mixal组装它并查看机器代码的hexdump吗?我不知道 MIX,但很好奇。我发现ENTi 记录在gnu.org/software/mdk/manual/html_node/…。 (而且那个 MIX 使用 6 位字节和 5 字节字......很有趣。难怪 Knuth 用 MMIX 代替它,一个 RISC 机器)

标签: assembly knuth taocp


【解决方案1】:

简答

我错过的一点是星号 (*) 是当前位置的值,只有在 组装 时才值得确认。由于 MIX 是一种修改指令本身的汇编语言I1 寄存器中存储的值是在运行时确定的

所以在这种情况下,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 寄存器中的字节值 4657 组合成 3001(= 46 * 64 + 57),即它们是基数为 64 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2017-08-28
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多