gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:53:43 27 4
gpt4 key购买 nike

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

x86 汇编,AT&T 语法。

最佳答案

在 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 位数量”的道德等价物,但您可以看到 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;第二个字节是英特尔所谓的“ModRM”字节,它指定了 EBX 和一个绝对 4 字节地址。

关于assembly - movl $_start, %eax 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4882747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com