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_startproc
和Ltmp2:
其在的机器指令,中间不作任何意义嫌民建联.
我不知道去哪里找出它们是什么以及它们的含义.我准备拔头发,因为我几个月来一直试图为初学者找到一个好资源.有什么建议?
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函数名称的下划线.L
和L
标签(目标)的下划线.OS X的汇编程序理解'.p2align'指令..align 4, 0x90
基本上做同样的事情.
并非编译器生成的代码中的所有指令对于汇编程序生成有效的对象代码都是必不可少的.它们都需要产生堆栈帧(调试)和异常处理的数据.有关更多信息,请参阅链接.
归档时间: |
|
查看次数: |
3697 次 |
最近记录: |