'$'后面跟一个标识符是什么意思?
x86汇编,AT& T语法。
答案 0 :(得分:13)
在AT& T语法中$
表示将后面的内容视为立即数而不是内存地址。换句话说,
movl $_start, %eax
将符号_start
的地址加载到%eax;
movl _start, %eax
从_start
地址的内存中读取4个字节到%eax。如果你看看两者的反汇编:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_386_32 _start
5: a1 00 00 00 00 mov 0x0,%eax
6: R_386_32 _start
你可以看到唯一的区别是操作码。方便的,有点自我命名,Intel® 64 and IA-32 Architectures Software Developer's Manual(你想要第2卷,这是指令集引用)说,操作码B8到BF编码“将立即加载16/32位常数加载到寄存器中”(这是代码注定要加载到32位代码段,因此它是32位加载;对于16位加载,你有一个“操作数大小覆盖”前缀字节,66)和操作码A1编码“加载32从DS(或任何其他段,带有适当的前缀字节)到EAX的指定32位偏移量的位数量。“使用典型的“平坦”内存模型,这就是“在指定的32位绝对地址下加载32位数量”的道德等价物,但您可以看到x86如何在机器级别上获得其可笑的复杂声誉。
如果您想知道,如果我们使用EBX,那就是它的样子:
a: bb 00 00 00 00 mov $0x0,%ebx
b: R_386_32 _start
f: 8b 1d 00 00 00 00 mov 0x0,%ebx
11: R_386_32 _start
Load-immediate仍然可以通过不计算操作数的单字节指令来完成(它是BB而不是B9,正如您所预料的那样,因为内部寄存器顺序是AX,CX,DX,BX,SP ,BP,SI,DI - 严重)但是从绝对地址加载现在有一个双字节指令,8B 1D;第二个字节是英特尔称之为“ModRM”的字节,它指定EBX和后面的绝对4字节地址。
答案 1 :(得分:2)
通常它意味着一个“立即”值,即一个数字,而不是另一个寄存器值,从内存中检索的东西等等。因此,在这种情况下,它将与符号_start
相关联的数字移动到eax寄存器。