GCC上x86 intel asm中方括号之前的偏移

Hritik

在我找到的所有文档中,没有提到像offset[var+offset2]Intel x86语法那样的语法,而是带有以下标志的GCC

gcc -S hello.c -o - -masm=intel

对于这个程序

#include<stdio.h>
int main(){
    char c = 'h';
    putchar(c);
    return 0;
}

产生

    .file   "hello.c"
    .intel_syntax noprefix
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    sub rsp, 16
    mov BYTE PTR -1[rbp], 104
    movsx   eax, BYTE PTR -1[rbp]
    mov edi, eax
    call    putchar@PLT
    mov eax, 0
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Arch Linux 9.3.0-1) 9.3.0"
    .section    .note.GNU-stack,"",@progbits

我想突出显示mov BYTE PTR -1[rbp], 104偏移量-1出现在方括号之外的那一行TBH,我只是在猜测这是一个偏移量,有人可以引导我找到突出显示此内容的适当文档吗?

这是一个类似的问题:来自IDA的x86 asm中的方括号,其中的确提到了偏移量,但我确实希望有适当的文档参考。

彼得·科德斯

是的,这只是另一种书写方式[rbp - 1],并且-1x86技术寻址模式术语1替代

GAS手册中有关x86寻址模式的部分仅提到了[ebp - 4]可能性,没有提到-4[ebp],但是GAS确实进行了组装。

以AT&T或Intel语法进行的反汇编可以确认其含义。x86寻址模式受机器可以编码的内容的约束(引用内存位置的内容。(x86寻址模式)),因此对于某些语法的含义没有太多的回旋余地。此语法是由GCC发出的,因此我们可以放心地假设它是有效的。它的含义与-1(%rbp)在AT&T语法模式下发出的含义相同。)

脚注1:整个rbp-1有效地址是seg:off地址偏移量部分。除FS和GS外,段基础在64位模式下固定为0,即使在32位模式下,主流OS也使用平面内存模型,因此您可以忽略段基础。我指出这一点仅仅是因为x86术语中的“偏移”确实具有与“位移”分开的特定技术含义,以防您关心使用与英特尔手册相匹配的术语。


由于某些原因,GCC的语法选择取决于-fno-pie或不取决于语法 https://godbolt.org/z/iK9jh6(在诸如Arch系统之类的现代GNU / Linux发行版上-fpie,默认情况下处于启用状态,而在Godbolt上则未启用)。

如果volatile用于强制写入堆栈变量或使用指针执行其他操作,则此选择将继续启用优化功能:例如https://godbolt.org/z/4P92Fk它适用于ptr[1 + x]从函数args进行的任意取消引用

  • GCC-fno-pie选择[rbp - 1][rdi+4+rsi*4]
  • GCC-fpie选择-1[rbp]4[rdi+rsi*4]

IDK为什么GCC的内部构造基于PIE模式选择不同。没有明显的原因;也许由于某些原因,他们只是在GCC内部使用了不同的代码路径,或者是不同的格式字符串,并且它们恰好做出了不同的选择。

无论有无PIE,都将全局(静态存储)称为glob[rip],也不[RIP + glob]支持。在两种情况下,这都意味着glob 相对于RIP,实际上不是RIP +符号的绝对地址。但这是适用于任何其他寄存器或没有寄存器的规则的例外。


GAS.intel_syntax类似于MASM,并且MASM当然也支持symbol[register],我什至认为1234[register]排量比较正常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

关于序言/调用函数gcc intel x86的一些问题

来自分类Dev

Intel X86组装-LT,GT,eq

来自分类Dev

Android Intel x86 Emulator KitKat(19)无法启动

来自分类Dev

什么等效于Intel x86中的REP stosl

来自分类Dev

AMD x86 和 Intel x86 之间的 MSR 差异是什么?

来自分类Dev

无法在Intel x86设备,Android 4.2.2上使用H264(视频/ AVC)编码器

来自分类Dev

在Intel x86上是否需要内存顺序:消耗,acq_rel和seq_cst?

来自分类Dev

无法在Intel x86设备,Android 4.2.2上使用H264(视频/ AVC)编码器

来自分类Dev

constexpr上的Intel vs GCC

来自分类Dev

constexpr上的Intel vs GCC

来自分类Dev

带有GCC的Intel ASM语法:未定义参考

来自分类Dev

x86 GAS中的标签偏移

来自分类Dev

x86 ASM上读取寄存器的延迟语义

来自分类Dev

如果8字节由不同线程写入,是否可以保证现代intel x86上8字节的读取正常?

来自分类Dev

ASM x86推和弹出

来自分类Dev

x86 ASM-逐行读取

来自分类Dev

ASM x86推和弹出

来自分类Dev

asm X86 - 分段错误?

来自分类Dev

C 调用 ASM (YASM x86)

来自分类常见问题

Intel x86 Atom和Atom_64系统映像之间有什么区别?

来自分类Dev

Android Studio模拟器:Intel Atom x86与ARM

来自分类Dev

离线(手动)为Android安装Intel x86 Atom系统映像

来自分类Dev

我如何找到在Intel x86 CPU上解码为指令的微操作?

来自分类Dev

如何编译Intel x86汇编代码以获取十六进制转储?

来自分类Dev

NOP是否会影响Intel x86架构中的状态寄存器?

来自分类Dev

x86 Intel Assembly和C ++-阵列周围的堆栈损坏

来自分类Dev

LDT和GDT在Intel x86中的用法有何不同?

来自分类Dev

无法安装Intel x86 Emulator Accelerator(HAXM安装程序)

来自分类Dev

[-] [-]在Intel x86 Assembly文档中是什么意思?

Related 相关文章

  1. 1

    关于序言/调用函数gcc intel x86的一些问题

  2. 2

    Intel X86组装-LT,GT,eq

  3. 3

    Android Intel x86 Emulator KitKat(19)无法启动

  4. 4

    什么等效于Intel x86中的REP stosl

  5. 5

    AMD x86 和 Intel x86 之间的 MSR 差异是什么?

  6. 6

    无法在Intel x86设备,Android 4.2.2上使用H264(视频/ AVC)编码器

  7. 7

    在Intel x86上是否需要内存顺序:消耗,acq_rel和seq_cst?

  8. 8

    无法在Intel x86设备,Android 4.2.2上使用H264(视频/ AVC)编码器

  9. 9

    constexpr上的Intel vs GCC

  10. 10

    constexpr上的Intel vs GCC

  11. 11

    带有GCC的Intel ASM语法:未定义参考

  12. 12

    x86 GAS中的标签偏移

  13. 13

    x86 ASM上读取寄存器的延迟语义

  14. 14

    如果8字节由不同线程写入,是否可以保证现代intel x86上8字节的读取正常?

  15. 15

    ASM x86推和弹出

  16. 16

    x86 ASM-逐行读取

  17. 17

    ASM x86推和弹出

  18. 18

    asm X86 - 分段错误?

  19. 19

    C 调用 ASM (YASM x86)

  20. 20

    Intel x86 Atom和Atom_64系统映像之间有什么区别?

  21. 21

    Android Studio模拟器:Intel Atom x86与ARM

  22. 22

    离线(手动)为Android安装Intel x86 Atom系统映像

  23. 23

    我如何找到在Intel x86 CPU上解码为指令的微操作?

  24. 24

    如何编译Intel x86汇编代码以获取十六进制转储?

  25. 25

    NOP是否会影响Intel x86架构中的状态寄存器?

  26. 26

    x86 Intel Assembly和C ++-阵列周围的堆栈损坏

  27. 27

    LDT和GDT在Intel x86中的用法有何不同?

  28. 28

    无法安装Intel x86 Emulator Accelerator(HAXM安装程序)

  29. 29

    [-] [-]在Intel x86 Assembly文档中是什么意思?

热门标签

归档