'$' 后面跟一个标识符是什么意思?
x86 汇编、AT&T 语法。
在 AT&T 语法中$
意味着将后面的内容视为立即常量而不是内存地址。换句话说,
movl $_start, %eax
加载符号的地址_start
进入%eax;
movl _start, %eax
从内存中读取 4 个字节,地址为_start
进入%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
你可以看到唯一的区别是操作码。方便,虽然有点自私的命名,英特尔® 64 和 IA-32 架构软件开发人员手册(你想要卷2,这是指令集参考)说操作码B8通过BF编码“将立即16/32位常量加载到寄存器中”(这是注定要加载到32位代码段中的代码,所以它是32 位加载;对于 16 位加载,您将有一个“操作数大小覆盖”前缀字节,66)并且操作码 A1 编码“在距 DS 指定的 32 位偏移处加载 32 位数量(或任何其他段(带有适当的前缀字节)到 EAX 中。”对于典型的“平面”内存模型,这在道德上相当于“在指定的 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
立即加载仍然可以使用不计算操作数的一字节指令来完成(它是 BB 而不是 B9,正如您所期望的那样,因为内部寄存器顺序是 AX、CX、DX、BX、SP、BP, SI、DI——认真的)但是从绝对地址加载现在有一个两字节指令,8B 1D;第二个字节是 Intel 所说的“ModRM”字节,它指定 EBX 和后面的绝对 4 字节地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)