代码之家  ›  专栏  ›  技术社区  ›  nglee

在taocp混合汇编语言中,“ent1*”是什么意思?

  •  2
  • nglee  · 技术社区  · 7 年前

    书中 计算机编程艺术第1卷,第三版 我很难理解下面的混合汇编语言教学的含义: ENT1 * ,出现在书的189页。

    (p.189)例如,如果我们想让 MAXN

         JMP  MAXN
         CON  n
    

    然后可以按如下方式编写子程序:

    MAXN STJ  *+1
         ENT1 *
    

    到目前为止我知道的是

    MAXN STJ  *+1
    

    存储内存的地址,其中 n 存储到指令所在的内存位置的[0:2]字段。 Ett1* 存储。

    因此,我猜下面这一行

         ENT1 *
    

    应该加载指令的内存位置的[0:2]字段的值。 Ett1* 存储到寄存器中 I1 .

    然而,星号的含义( * ,如教科书所述:

    (p.146)星号(读作“self”)是指出现星号的线的位置。

    所以,不应该 Ett1* 只需存储指令所在的内存位置的地址 Ett1* 存储到寄存器中 I1 ?

    1 回复  |  直到 7 年前
        1
  •  3
  •   nglee    7 年前

    简短回答

    我漏掉的一点是星号( * )作为当前位置的价值只有在 装配 . 因为mix是一种汇编语言 修改指令本身 , 存储在 I1 寄存器在运行时确定 .

    在这种情况下,星号( * ENT1 * 没有意义。甚至可以改变 * 任何 值,因为存储在 I1 寄存器将由先前的指令决定: STJ *+1 .

    使用混合生成器验证

    我已经将以下混合汇编语言代码与 MIX Builder 在Windows 10上,下载自 here .

          ORIG 3000
    BEGIN JMP  MAXN
          CON  100
    MAXN  STJ  *+1
          ENT1 *
          LD3  0,1
          HLT
          END  BEGIN
    

    组装后的结果是:

    enter image description here

    我们可以检查第5行的说明, Ett1* ,具有当前内存位置 3003 存储在[0:2]字段中。

    执行第4行后,第5行的[0:2]字段更改为 3001 内存位置的常量 100 存储:

    enter image description here

    因此,在执行第5行之后, 三千零一 (不是) 三千零三 )将存储在 I1 注册:

    enter image description here

    注意,组合字节值 46 57 I1 注册结果 3001(= 46 * 64 + 57) ,即它们是以64为基数的值。

    推荐文章