关于Mac上的xcode:x86汇编

关于Mac上的xcode:x86汇编

x86 Assembly on a Mac

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

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

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


在安装了针对基于Intel的Mac的任何版本的Xcode之后,您应该能够编写汇编代码。 Xcode是一套工具,其中只有一个是IDE,因此如果您不想使用它,则不必使用它。 (也就是说,如果您觉得有些笨拙,请向Apple的错误报告者提交错误-每个错误都要进行工程设计。)此外,安装Xcode会同时安装Netwide汇编程序(NASM)和GNU汇编程序(GAS);这样一来,您就可以使用最熟悉的任何汇编语法。

您还需要查看《编译器和调试指南》,因为这些文档记录了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特定实现来获得高性能。 。

去组装很有趣。如今,为了速度而去组装并不是为了胆小。


如前所述,请勿使用syscall。您可以使用标准的C库调用,但是请注意,每个Apple的IA32函数调用ABI堆栈必须对齐16个字节。

如果不对齐堆栈,则在调用任何库或框架时,程序将在__dyld_misaligned_stack_error中崩溃。

以下代码片段将在我的系统上组装并运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
; 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


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

对于nasm:

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

对于ld:

1
2
3
4
5
-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

对于壳牌:

1
./hello.o - execution

单线:

1
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


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


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

但是您也可以不使用XCode。

只要遵循:

  • 首先使用Homebrew brew install nasm安装NASM
  • 使用此命令nasm -f macho64 myFile.asm将.asm文件转换为Obj文件
  • 使用命令ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64运行Obj File以查看OutPut
  • 为方便起见,下面编写了一个名为myFile.asm的简单文本文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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

    Also, on the Intel Macs, can I use generic x86 asm? or is there a modified instruction set? Any information about post Intel Mac assembly helps.

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


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

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


    不要忘了,与Windows不同,所有基于Unix的系统都需要与Windows不同,源必须在目标之前

    在Windows上:

    mov $ source,%destination

    但在Mac上则相反。


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


    推荐阅读