x86在Mac上组装

mat*_*nam 57 macos x86 assembly xcode

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

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

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

Chr*_*son 74

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

您还需要查看编译器和调试指南,因为它们记录了运行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特定实现来获得高性能.

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

  • 链接不再有效 (8认同)
  • Archive.org版本(最新版本被砍掉之前)http://web.archive.org/web/20090622125037/http://developer.apple.com/documentation/DeveloperTools/CompilersDebuggers-date.html (3认同)

小智 29

如前所述,不要使用系统调用.您可以使用标准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
Run Code Online (Sandbox Code Playgroud)


Jar*_*ows 9

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

对于nasm:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

对于壳牌:

./hello.o - execution
Run Code Online (Sandbox Code Playgroud)

一内胆:

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
Run Code Online (Sandbox Code Playgroud)

如果这有帮助,请告诉我!

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

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

为了更详细的解释,我在我的Github上解释说:

https://github.com/jaredsburrows/Assembly


Fla*_*dan 8

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


Jos*_*osh 6

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

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


Akh*_*zir 5

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

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

请关注:

  1. 首先使用Homebrew安装NASM brew install nasm
  2. 使用此命令将.asm文件转换为Obj文件 nasm -f macho64 myFile.asm
  3. 运行Obj File以查看OutPut using命令 ld -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
Run Code Online (Sandbox Code Playgroud)