我是汇编语言的新手。我最近陷入了悲惨的境地。 我创建了一个示例汇编程序,如下所示:
head.h
#define _Length_ 0x0A
main.S
movw $_LENGTH_, %ax
movw _LENGTH_, %ax
现在两个MOV语句有什么区别? ax的价值是什么?
我正在使用Ubuntu和GAS汇编程序(AT& T语法)。
提前致谢
答案 0 :(得分:5)
$
和%
修饰符使解析更简单(对于汇编程序,不一定是人类)。
我假装你实际上写了#define _LENGTH_ 0x0A
而不是#define _Length_ 0x0A
。
如果没有,则汇编器将_LENGTH_
视为外部符号,而_Length_
是您定义的宏,永远不会被替换,因此汇编器永远不会知道它存在。 C预处理器与汇编器完全分开,就像在C中一样。
$
始终意味着立即不变。所以movw $0x0A, %ax
将0xA放入AX。
没有$
作为操作数的数字或符号始终表示内存操作数。 movw 0x0A, %ax
是从地址[ds:0xA]
到AX的加载(使用NASM表示法作为有效地址)。这几乎不是你想要的。
movw $undefined_symbol, %ax
将汇编(使用objdump -drwC
查看.o
中的重定位信息),但在链接时失败。