len:  equ  2
len:  db   2

它们是否相同,产生的标签可以代替2使用?如果不是,那么每种声明形式的优点或缺点是什么?它们可以互换使用吗?

最佳答案

第一个是equate,类似于C的:

#define len 2
因为它实际上并没有在最终代码中分配任何空间,它只是将len符号设置为等于2。然后,当您稍后在源代码中使用len时,就如同您正在使用常量2
第二个是define byte,类似于C的:
int len = 2;
它实际上确实分配了空间,在内存中为一个字节,在其中存储了2,并将len设置为该字节的地址。
这是一些伪汇编代码,显示了区别:
line   addr   code       label   instruction
----   ----   --------   -----   -----------
   1   0000                      org    1234
   2   1234              elen    equ    2
   3   1234   02         dlen    db     2
   4   1235   44 02 00           mov    ax     elen
   5   1238   44 34 12           mov    ax     dlen
第1行仅将程序集地址设置为1234,以便于解释发生的事情。
在第2行中,不会生成任何代码,汇编程序只需将elen的值2加载到符号表中。由于未生成任何代码,因此地址不会更改。
然后,当您在第4行使用它时,它将把该值加载到寄存器中。
第3行表明db是不同的,它实际上分配了一些空间(一个字节)并将值存储在该空间中。然后,它将dlen加载到符号表中,但为其提供该地址的值1234而不是常量值2
以后在第5行上使用dlen时,您将获得地址,必须将其取消引用才能获取实际值2

08-16 02:27