在Mac上汇编和在linux上汇编有什么区别?

Wil*_*ver 14 macos x86 assembly gcc x86-64

我一直在尝试熟悉mac上的汇编,从我所知道的,文档非常稀疏,大多数关于这个主题的书都是针对windows或linux的.我以为我可以很容易地从linux转换到mac,但这个(linux)

.file   "simple.c"
.text
.globl simple
.type   simple, @function
simple:
      pushl   %ebp
      movl    %esp, %ebp
      movl    8(%ebp), %edx
      movl    12(%ebp), %eax
      addl    (%edx), %eax
      movl    %eax, (%edx)
      popl    %ebp
      ret
.size   simple, .-simple
.ident  "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
.section        .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

看起来与此非常不同(mac)

.section    __TEXT,__text,regular,pure_instructions
.globl  _simple
.align  4, 0x90
_simple:                                ## @simple
    .cfi_startproc
## BB#0:
pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    addl    (%rdi), %esi
    movl    %esi, (%rdi)
    movl    %esi, %eax
    popq    %rbp
    ret
    .cfi_endproc


.subsections_via_symbols
Run Code Online (Sandbox Code Playgroud)

"正常"(缺少更好的词)指令和寄存器等pushq %rbp不要担心我.但"怪异"的像.cfi_startprocLtmp2:其在的机器指令,中间不作任何意义嫌民建联.

我不知道去哪里找出它们是什么以及它们的含义.我准备拔头发,因为我几个月来一直试图为初学者找到一个好资源.有什么建议?

Bre*_*ale 14

首先,您将32位x86程序集与64位x86-64进行比较.虽然OS X Mach-O ABI支持32位IA32,但我怀疑你想要x86-64 SysV ABI.(值得庆幸的是,x86-64.org网站似乎再次亮相).的Mach-O的x86-64的模型本质上是ELF/SysV的ABI的变型,因此,差异是用户空间代码相对较小,即使有不同的汇编.

这些.cfi指令是DWARF调试指令,你不需要组装它们 - 它们用于调用帧信息等.这里有一些最小的例子:

ELF x64-64汇编程序:

    .text
    .p2align 4

    .globl  my_function
    .type   my_function,@function

my_function:
    ...
.L__some_address:

    .size    my_function,[.-my_function]
Run Code Online (Sandbox Code Playgroud)

Mach-O x86-64汇编程序:

    .text
    .p2align 4

    .globl  _my_function

_my_function:
    ...
L__some_address:
Run Code Online (Sandbox Code Playgroud)

除了编写asm教程之外,汇编程序之间的主要区别在于:Mach-O函数名称的下划线.LL标签(目标)的下划线.OS X的汇编程序理解'.p2align'指令..align 4, 0x90基本上做同样的事情.

并非编译器生成的代码中的所有指令对于汇编程序生成有效的对象代码都是必不可少的.它们需要产生堆栈帧(调试)和异常处理的数据.有关更多信息,请参阅链接.