at&t汇编语法中带$或不带$符号的数字有什么区别?

REA*_*EE 3 assembly

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

0x1234 00010203 04050607 08090a0b 0c0d0e0f
0x1238 10000000
Run Code Online (Sandbox Code Playgroud)

在代码中,

mov $0x1234, %eax
mov 0x1238, %ebx
Run Code Online (Sandbox Code Playgroud)

我相信使用$符号,它将是常数,因此%eax将具有内存地址,但%ebx呢?

两条指令究竟有什么不同?

phu*_*clv 7

区别在于$它是数值而没有$它是地址

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

movl 10, %eax
movl foo, %eax
Run Code Online (Sandbox Code Playgroud)

对应于intel语法:

mov eax, [10]
mov eax, [foo]
Run Code Online (Sandbox Code Playgroud)

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

movl $10, %eax
movl $foo, %eax
Run Code Online (Sandbox Code Playgroud)

在Intel语法中:

mov eax, 10
mov eax, offset foo
Run Code Online (Sandbox Code Playgroud)

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