4

假设 .data 部分有以下项目:

0x1234 00010203 04050607 08090a0b 0c0d0e0f
0x1238 10000000

在代码中,

mov $0x1234, %eax
mov 0x1238, %ebx

我相信使用 $ 符号,它会是常数,所以 %eax 会有内存地址,但是 %ebx 呢?

两条指令有什么不同?

4

1 回答 1

10

不同之处在于$它是数值,而没有$它是该地址的内存内容

如果指令的参数没有任何特殊标记(例如寄存器的 % 或数字常量的 $),则它是内存访问。所以如下:

movl 10, %eax
movl foo, %eax

对应于 intel 语法:

mov eax, [10]
mov eax, [foo]

要使用数字常量,或使用标签地址,有 $ 运算符:

movl $10, %eax
movl $foo, %eax

在英特尔语法中:

mov eax, 10
mov eax, offset foo

http://x86asm.net/articles/what-i-dislike-about-gas/

于 2013-09-25T07:01:32.160 回答