67

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

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

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

4

8 回答 8

83

在安装了针对基于 Intel 的 Mac 的任何版本的 Xcode 后,您应该能够编写汇编代码。Xcode 是一套工具,其中只有一个是 IDE,所以如果您不想使用,则不必使用它。(也就是说,如果您发现某些特定的东西很笨拙,请在Apple 的 bug 报告员处提交错误- 每个错误都属于工程。)此外,安装 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。这将确保您编写的代码可从操作系统的一个版本移植到下一个版本。

最后,请记住,Mac OS X 运行在相当广泛的硬件上——从 32 位 Core Single 到高端四核 Xeon。通过在汇编中编码,您可能没有像您想象的那样优化;在一台机器上最佳的东西在另一台机器上可能是最差的。Apple 定期测量其编译器并使用“-Os”优化标志调整其输出以使其在整个产品线中体面,并且有广泛的矢量/矩阵处理库,您可以使用这些库通过手动调整的 CPU 特定实现获得高性能.

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

于 2008-08-08T07:07:10.540 回答
30

如前所述,不要使用系统调用。您可以使用标准 C 库调用,但请注意堆栈必须按照 Apple 的IA32 函数调用 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
于 2008-12-10T18:46:36.263 回答
10

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

于 2013-07-23T03:12:27.617 回答
8

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

于 2011-07-15T03:12:10.043 回答
7

在 Mac 上运行汇编代码离您只有 3 步之遥。可以使用 XCODE 完成,但更好的是使用 NASM 命令行工具。为方便起见,我已经安装了 Xcode,如果您安装了 Xcode,那就太好了。

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

只需关注:

  1. 首先使用 Homebrew 安装 NASMbrew install nasm
  2. 使用此命令将 .asm 文件转换为 Obj 文件nasm -f macho64 myFile.asm
  3. 使用命令运行 Obj File 以查看 OutPutld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64

为方便起见,下面编写了名为 myFile.asm 的简单文本文件。

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
于 2018-01-25T15:27:18.700 回答
6

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

这是相同的指令集;这是相同的筹码。

于 2008-08-08T04:33:25.203 回答
1

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

就工具而言,我认为您最好的选择是“理解”汇编的优秀文本编辑器。

于 2008-08-08T04:35:51.297 回答
0

忘记寻找在 Mac 上编写/运行/编译汇编程序的 IDE。但是,记住 mac 是 UNIX。请参阅http://asm.sourceforge.net/articles/linasm.html。在 Linux 上通过 GCC 运行汇编程序的体面指南(虽然很短)。你可以模仿这个。Mac 使用 Intel 芯片,因此您想查看 Intel 语法。

于 2008-08-08T05:18:41.320 回答