Yes, it's just another way of writing [rbp - 1]
, and the -1
is a displacement in technical x86 addressing mode terminology1.
GAS 手册的部分在 x86 寻址模式上只提到了[ebp - 4]
可能性,不-4[ebp]
,但 GAS 确实组装了它。
AT&T 或 Intel 语法中的反汇编证实了它的含义。 x86 寻址模式受到机器可以编码的内容的限制(引用内存位置的内容。 (x86 寻址模式)),因此某些语法的含义没有太多回旋余地。 (该语法是由 GCC 发出的,因此我们可以放心地假设它是有效的。这和它的意思是一样的-1(%rbp)
它以 AT&T 语法模式发出。)
脚注1:整体rbp-1
有效地址是offsetseg:off 地址的一部分。在64位模式下,除FS和GS外,段基数固定为0,即使在32位模式下,主流操作系统也使用平面内存模型,因此可以忽略段基数。我指出这一点只是因为 x86 术语中的“偏移”确实具有与“位移”不同的特定技术含义,以防您关心使用与英特尔手册相匹配的术语。
由于某种原因,GCC 的语法选择取决于-fno-pie
or not. https://godbolt.org/z/iK9jh6(在现代 GNU/Linux 发行版上,例如 Arch 系统,-fpie默认启用。在 Godbolt 上则不然)。
如果您使用,此选择将在启用优化的情况下继续volatile
强制写入堆栈变量,或使用指针执行其他操作:例如https://godbolt.org/z/4P92Fk。它适用于任意取消引用,例如ptr[1 + x]
来自函数参数。
- GCC
-fno-pie
选择[rbp - 1]
and [rdi+4+rsi*4]
- GCC
-fpie
选择-1[rbp]
and 4[rdi+rsi*4]
我不知道为什么 GCC 内部根据 PIE 模式选择不同。没有明显的原因;也许由于某种原因,他们只是在 GCC 内部使用了不同的代码路径,或者不同的格式字符串,并且他们只是碰巧做出了不同的选择。
无论有没有 PIE,全局(静态存储)都被引用为glob[rip]
, not [RIP + glob]
这也受到支持。在这两种情况下都意味着glob
关于RIP,实际上并不是RIP+符号的绝对地址。但这是适用于任何其他寄存器或无寄存器的规则的例外。
GAS .intel_syntax
与 MASM 类似,MASM 当然支持symbol[register]
我认为甚至1234[register]
。位移比较正常。