movl $ _start,%eax是什么意思?

时间:2011-02-03 05:15:45

标签: assembly x86

'$'后面跟一个标识符是什么意思?

x86汇编,AT& T语法。

2 个答案:

答案 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寄存器。