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

Posted

技术标签:

【中文标题】at&t 汇编语法中带 $ 或不带 $ 符号的数字有啥区别?【英文标题】:What's difference between number with $ or without $ symbol in at&t assembly syntax?at&t 汇编语法中带 $ 或不带 $ 符号的数字有什么区别? 【发布时间】:2013-09-25 05:25:15 【问题描述】:

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

0x1234 00010203 04050607 08090a0b 0c0d0e0f
0x1238 10000000

在代码中,

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

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

两条指令有什么不同?

【问题讨论】:

【参考方案1】:

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

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

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/

【讨论】:

那么你是说mov $0x1238, %ebx 只是数字常量而不是内存访问,即使内存中存在 0x1238 地址? Memory access 这里是数据,不是指令

以上是关于at&t 汇编语法中带 $ 或不带 $ 符号的数字有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下AT&T汇编语法格式与Intel汇编语法格式异同

需要一个很好的 AT&T 汇编语法来源

与 AT&T 相比,英特尔汇编语法的局限性 [关闭]

x86汇编程序基础(AT&T语法)

关于 AT&T 汇编语法 (%esp,1)

使用 AT&T 语法时汇编程序崩溃 [重复]