OS Xでアセンブリからシステムコール呼び出し

とりあえずのhello world

.file "hello.S"
.data
msg:
        .ascii "hello world\n"
        len = . - msg

.text
.globl start
start:
        # call write(1, $msg, $len)
        pushl $len
        pushl $msg
        pushl $1
        lea -4(%esp), %ecx    # stack pointer - 4
        movl $call_exit, %edx # return address
        movl $4,%eax          # system call number of 'write'
        sysenter
call_exit:
        # call exit(0)
        pushl $0
        lea -4(%esp), %ecx
        movl $0, %edx # meaningless
        movl $1, %eax # system call number of 'exit'
        sysenter

実行可能バイナリを作るには

as -o hello.o hello.S && ld -o hello hello.o

でOK。

linuxシステムコール呼び出しでは

だったのが、xnuでは

となっていて、また一つ違いの分かる人になれて良かったです。