在mac上的程序集和linux上的程序集有什么区别?

编程入门 行业动态 更新时间:2024-10-28 08:26:42
本文介绍了在mac上的程序集和linux上的程序集有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我一直试图熟悉mac上的程序集,并且据我所知,文档非常稀少,大多数关于该主题的书籍都针对windows或linux。我认为我可以很容易地从linux转换到mac,但是这(linux)

.filesimple.c .text .globl简单 .type简单,@function 简单: 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 .identGCC:(Ubuntu 4.3.2-1ubuntu11)4.3.2 .section .note。 GNU-stack,,@ progbits

看起来与此不同(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 $ b .b .subsections_via_symbols

正常(缺少一个更好的单词)指令和寄存器(如 pushq%rbp )不担心我。但是在机器指令中间敲击的奇怪的如 .cfi_startproc 和 Ltmp2:没有任何意义。

我不知道要去哪里找出这些是什么以及它们的含义。我正要把我的头发拉出来,因为我一直在努力为几个月的初学者找到一个好的资源。有什么建议?

解决方案

首先,您将32位x86汇编与64位x86-64进行比较。 OS X Mach-O ABI支持32位IA32,我怀疑你需要 x86-64 SysV ABI 。 (谢天谢地, x86-64 网站似乎再次出现)。 Mach-O x86-64 模型基本上这是ELF / SysV ABI的一个变体,所以对于用户空间代码,即使使用不同的汇编器,差异也相对较小。

$ b $ < .cfi 指令是 DWARF 调试指令,您并不严格需要进行汇编 - 它们用于调用框架信息等等。以下是一些最简单的例子:

ELF x64-64汇编器:

.text .p2align 4 .globl my_function .type my_function,@ function $ b $ my_function: ... .L__some_address: .size my_function,[.- my_function]

Mach-O x86-64汇编器:

.text .p2align 4 .globl _my_function _my_function: ... L__some_address:

,汇编器之间的主要区别在于:对于标签,Mach-O函数名称的前导下划线 .L vs L (目的地)。具有OS X的汇编程序理解'.p2align'指令。 .align 4,0x90 本质上是做同样的事情。

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

I've been trying to get familiar with assembly on mac, and from what I can tell, the documentation is really sparse, and most books on the subject are for windows or linux. I thought I would be able to translate from linux to mac pretty easily, however this (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

seems pretty different from this (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

The "normal" (for lack of a better word) instructions and registers such as pushq %rbp don't worry me. But the "weird" ones like .cfi_startproc and Ltmp2: which are smack dab in the middle of the machine instructions don't make any sense.

I have no idea where to go to find out what these are and what they mean. I'm about to pull my hair out as I've been trying to find a good resource for beginners for months. Any suggestions?

解决方案

To begin with, you're comparing 32-bit x86 assembly with 64-bit x86-64. While the OS X Mach-O ABI supports 32-bit IA32, I suspect you want the x86-64 SysV ABI. (Thankfully, the x86-64 site seems to be up again). The Mach-O x86-64 model is essentially a variant of the ELF / SysV ABI, so the differences are relatively minor for user-space code, even with different assemblers.

The .cfi directives are DWARF debugging directives that you don't strictly need for assembly - they are used for call frame information, etc. Here are some minimal examples:

ELF x64-64 assembler:

.text .p2align 4 .globl my_function .type my_function,@function my_function: ... .L__some_address: .size my_function,[.-my_function]

Mach-O x86-64 assembler:

.text .p2align 4 .globl _my_function _my_function: ... L__some_address:

Short of writing an asm tutorial, the main differences between the assemblers are: leading underscores for Mach-O functions names, .L vs L for labels (destinations). The assembler with OS X understands the '.p2align' directive. .align 4, 0x90 essentially does the same thing.

Not all the directives in compiler-generated code are essential for the assembler to generate valid object code. They are required to generate stack frame (debugging) and exception handling data. Refer to the links for more information.

更多推荐

在mac上的程序集和linux上的程序集有什么区别?

本文发布于:2023-10-08 02:20:07,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:程序   有什么区别   mac   linux

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!