x86在Mac上组装

时间:2008-08-08 04:25:12

标签: xcode macos x86 assembly

有没有人知道在Mac上编写程序集的任何好工具(我正在寻找IDE)。 Xcode对我来说有点麻烦。

另外,在Intel Mac上,我可以使用通用x86 asm吗?或者是否有修改过的指令集?有关发布英特尔的任何信息。

另外:我知道在Windows上,asm可以在操作系统创建的模拟环境中运行,让代码认为它在自己的专用机器上运行。 OS X是否提供相同的功能?

9 个答案:

答案 0 :(得分:69)

安装面向基于Intel的Mac的任何Xcode版本后,您应该能够编写汇编代码。 Xcode是一套工具,其中只有一个是IDE,因此如果您不想使用它,则不必使用它。 (也就是说,如果有特定的东西你发现很笨,请在Apple's bug reporter提交一个错误 - 每个错误都归工程。)此外,安装Xcode将同时安装Netwide Assembler(NASM)和GNU Assembler(GAS) );这将允许您使用您最熟悉的任何汇编语法。

您还需要查看Compiler & Debugging Guides,因为这些文档记录了运行Mac OS X的各种体系结构的调用约定,以及二进制格式和加载程序的工作方式。特别是IA-32(x86-32)呼叫约定可能与您习惯的略有不同。

要记住的另一件事是Mac OS X上的系统调用界面与您在DOS / Windows,Linux或其他BSD版本上使用的界面不同。系统调用在Mac OS X上不被视为稳定的API;相反,你总是通过libSystem。这将确保您编写可从一个OS版本移植到下一个版本的代码。

最后,请记住,Mac OS X运行的是各种各样的硬件 - 从32位Core Single到高端四核Xeon。通过汇编编码,您可能没有像您想象的那样进行优化;在一台机器上最佳的可能在另一台机器上是最小的。 Apple定期测量其编译器并使用“-Os”优化标志调整其输出,以便在整个生产线上保持良好状态,并且有大量的矢量/矩阵处理库可用于通过手动调整的CPU特定实现来获得高性能

去装配乐趣很棒。如今,为了速度而去集会并不适合胆小的人。

答案 1 :(得分:29)

如前所述,请勿使用系统调用。您可以使用标准C库调用,但请注意,堆栈必须按照Apple的IA32 function call ABI进行16字节对齐。

如果你没有对齐堆栈,当你调用任何库或框架时,你的程序将在__dyld_misaligned_stack_error中崩溃。

以下代码段汇编并在我的系统上运行:

; File: hello.asm
; Build: nasm -f macho hello.asm && gcc -o hello hello.o

SECTION .rodata
hello.msg db 'Hello, World!',0x0a,0x00

SECTION .text

extern _printf ; could also use _puts...
GLOBAL _main

; aligns esp to 16 bytes in preparation for calling a C library function
; arg is number of bytes to pad for function arguments, this should be a multiple of 16
; unless you are using push/pop to load args
%macro clib_prolog 1
    mov ebx, esp        ; remember current esp
    and esp, 0xFFFFFFF0 ; align to next 16 byte boundary (could be zero offset!)
    sub esp, 12         ; skip ahead 12 so we can store original esp
    push ebx            ; store esp (16 bytes aligned again)
    sub esp, %1         ; pad for arguments (make conditional?)
%endmacro

; arg must match most recent call to clib_prolog
%macro clib_epilog 1
    add esp, %1         ; remove arg padding
    pop ebx             ; get original esp
    mov esp, ebx        ; restore
%endmacro

_main:
    ; set up stack frame
    push ebp
    mov ebp, esp
    push ebx

    clib_prolog 16
    mov dword [esp], hello.msg
    call _printf
    ; can make more clib calls here...
    clib_epilog 16

    ; tear down stack frame
    pop ebx
    mov esp, ebp
    pop ebp
    mov eax, 0          ; set return code
    ret

答案 2 :(得分:8)

有关x86 Mac特定介绍的详细步骤,请参阅http://peter.michaux.ca/articles/assembly-hello-world-for-os-x。我试过的其他链接有一些非Mac的缺陷。

答案 3 :(得分:7)

最近我想学习如何在Mac OS X上编译Intel x86:

对于nasm:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

对于ld:

-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile

对于Shell:

./hello.o - execution

一衬垫:

nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o

请告诉我这是否有帮助!

我在博客上写了如何做到这一点:

http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html

有关更详细的解释,我在Github上解释说:

https://github.com/jaredsburrows/Assembly

答案 4 :(得分:5)

在Mac上运行汇编代码距离您只有3步之遥。它可以使用XCODE完成,但更好的是使用NASM命令行工具。 为了我的轻松,我已经安装了Xcode,如果你已经安装了Xcode。

但你也可以在没有XCode的情况下做到这一点。

关注:

  1. 首先使用Homebrew nasm -f macho64 myFile.asm
  2. 安装NASM
  3. 使用此命令ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64
  4. 将.asm文件转换为Obj文件
  5. 使用命令global start section .text start: mov rax, 0x2000004 ; write mov rdi, 1 ; stdout mov rsi, msg mov rdx, msg.len syscall mov rax, 0x2000001 ; exit mov rdi, 0 syscall section .data msg: db "Assalam O Alaikum Dear", 10 .len: equ $ - msg
  6. 运行Obj文件以查看OutPut 为方便起见,

    名为myFile.asm的简单文本文件如下所示。

    TSLint

答案 5 :(得分:4)

  

另外,在Intel Mac上,我可以使用通用x86 asm吗?或者是否有修改过的指令集?有关发布英特尔Mac程序集的任何信息都有帮助。

它是相同的指令集;它是相同的芯片。

答案 6 :(得分:1)

可供使用的功能取决于您的处理器。 Apple使用与其他人相同的英特尔产品。所以是的,通用x86应该没问题(假设你不在PPC上:D)。

就工具而言,我认为你最好的选择是一个“理解”装配的好文本编辑器。

答案 7 :(得分:0)

忘记在Mac上找到一个IDE来编写/运行/编译汇编程序。但是,请记住mac是UNIX。见http://asm.sourceforge.net/articles/linasm.html。在Linux上通过GCC运行汇编程序的一个不错的指南(尽管很短)。你可以模仿这个。 Mac使用英特尔芯片,因此您需要查看英特尔语法。

答案 8 :(得分:0)

不要忘记,与Windows不同,所有基于Unix的系统都需要在目标之前拥有源代码,而不像Windows

在Windows上:

mov $ source,%destination

但是在Mac上反过来。