os x中的汇编语言

时间:2011-08-09 02:48:04

标签: macos assembly

我逐步使用汇编语言来学习linux上的汇编语言编程。我最近买了一台Mac,int 0x80似乎不起作用(非法指令)。

所以只是想知道是否有一个很好的参考书(书/网页),它给出了标准的unix程序集和darwin程序集的差异。

3 个答案:

答案 0 :(得分:4)

出于实际目的,此答案显示how to compile a hello world application using nasm on OSX

此代码可以按原样编译为linux,但编译它的cmd-line命令可能会有所不同:

section .text

global mystart                ; make the main function externally visible

mystart:

; 1 print "hello, world"

    ; 1a prepare the arguments for the system call to write
    push dword mylen          ; message length                           
    push dword mymsg          ; message to write
    push dword 1              ; file descriptor value

    ; 1b make the system call to write
    mov eax, 0x4              ; system call number for write
    sub esp, 4                ; OS X (and BSD) system calls needs "extra space" on stack
    int 0x80                  ; make the actual system call

    ; 1c clean up the stack
    add esp, 16               ; 3 args * 4 bytes/arg + 4 bytes extra space = 16 bytes

; 2 exit the program

    ; 2a prepare the argument for the sys call to exit
    push dword 0              ; exit status returned to the operating system

    ; 2b make the call to sys call to exit
    mov eax, 0x1              ; system call number for exit
    sub esp, 4                ; OS X (and BSD) system calls needs "extra space" on stack
    int 0x80                  ; make the system call

    ; 2c no need to clean up the stack because no code here would executed: already exited

section .data

  mymsg db "hello, world", 0xa  ; string with a carriage-return
  mylen equ $-mymsg             ; string length in bytes

将源(hello.nasm)汇编到目标文件:

nasm -f macho hello.nasm

生成可执行文件的链接:

ld -o hello -e mystart hello.o

答案 1 :(得分:1)

这个问题可能会有所帮助:List of and documentation for system calls for XNU kernel in OSX

不幸的是,看起来这本书提到的唯一方法就是找出来。对于int 0x80,我怀疑它是否会起作用,因为它是一个非常特定于Linux的API,内置于内核中。

我在处理一个不熟悉的操作系统时所做的妥协只是使用libc调用,但我可以理解,如果你只是想学习,那么即使这可能是太高级了。

答案 2 :(得分:0)

你可以发布你的代码以及你如何编译? (有很多方法可以引发非法指令错误)

OSX选择了传递参数的bsd风格,这就是为什么你必须做的事情略有不同。

我刚才为此添加了书签:http://www.freebsd.org/doc/en/books/developers-handbook/book.html#X86-SYSTEM-CALLS