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
。