在Mac上的x86汇编

有谁知道任何好的工具(我主要是在寻找IDE)在Mac上编写程序集… Xcode对我来说有点麻烦。

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

另外:我知道在windows上,asm可以在由OS创build的模拟环境中运行,让代码认为它在自己的专用计算机上运行… OSX是否提供相同的function?

安装任何针对基于Intel的Mac的Xcode版本之后,您应该可以编写汇编代码。 Xcode是一套工具,其中只有一个是IDE,所以如果你不想使用它,你不必使用它。 (也就是说,如果有特定的东西,你会发现笨重的,请在苹果的臭虫记者提出一个错误 – 每一个错误去工程。)此外,安装Xcode将安装networking汇编(NASM)和GNU汇编程序(GAS)。 这将使您可以使用任何您最喜欢的汇编语法。

您还需要查看“ 编译器和debugging指南” ,因为这些文档logging了用于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。 通过在程序集中编码,你可能不会像你想象的那样进行优化。 一台机器上的最佳性能可能在另一台机器上是最佳的。 苹果会定期测量其编译器,并使用“-Os”优化标记调整输出,以便在整个产品线上有所体现,并且有大量的vector/matrix处理库可用于通过手动调整的CPU特定实现获得高性能。

去集会很好玩。 为了速度而聚集在一起,这些日子已经不是心灵的枷锁了。

如前所述,不要使用系统调用。 尽pipe你可以使用标准的C库调用,但是请注意,每个苹果的IA32函数调用ABI ,堆栈必须是16字节alignment的。

如果您没有alignment堆栈, __dyld_misaligned_stack_error当您调用任何库或框架时,程序将在__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 

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

最近我想学习如何在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 

对于壳牌:

 ./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

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

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

可用function取决于您的处理器。 苹果使用与其他人相同的英特尔东西。 所以是的,通用x86应该没问题(假设你不在PPC:D上)。

至于工具去,我认为你最好的select是一个很好的文本编辑器,“理解”大会。

忘记find一个IDE在Mac上编写/运行/编译汇编程序。 但是,记住mac是UNIX。 请参阅http://asm.sourceforge.net/articles/linasm.html 。 一个体面的指导(尽pipe很短),通过Linux上的GCC运行汇编程序。 你可以模仿这个 苹果机使用英特尔芯片,所以你想看看英特尔的语法。

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

在Windows上:

mov $ source,%destination

但在Mac上反过来。