我有以下文件:
; hello.s
.section __TEXT,__text
.globl _main
_main:
movl $0x2000001, %eax
movl $42, %ebx
syscall
我尝试如下运行它:
# run.sh
as -mmacosx-version-min=10.9 hello.s -o hello.o
ld -macosx_version_min 10.9 -lSystem hello.o -e _main -o hello
./hello
echo $?
输出为:
$ ./run.sh
1
我希望是
$ ./run.sh
42
这是怎么了?
编辑:
根据zneak的回答,我们需要使用%edi寄存器进行系统调用,因此工作程序为:
; hello.s
.section __TEXT,__text
.globl _main
_main:
movl $0x2000001, %eax
movl $42, %edi
syscall
答案 0 :(得分:5)
在64位macOS上的系统调用使用System V ABI,因此您需要将第一个参数写入%edi而不是%ebx。就像普通调用一样,系统调用的参数寄存器为rdi,rsi,rdx,rcx,r8,r9。
当前,您得到1,因为rdi包含main的argc参数,并且Shell使用一个参数调用程序。