x86_64 macOS Mojave 上的程序集退出系统调用参数?
x86_64 assembly exit system call parameter on macOS Mojave?
我有以下文件:
; hello.s
.section __TEXT,__text
.globl _main
_main:
movl [=11=]x2000001, %eax
movl , %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 [=15=]x2000001, %eax
movl , %edi
syscall
64 位 macOS 上的系统调用使用 System V ABI,因此您需要将第一个参数写入 %edi 而不是 %ebx。就像普通调用一样,系统调用的参数寄存器是 rdi、rsi、rdx、rcx、r8、r9。
目前,您得到 1,因为 rdi 包含 main 的 argc 参数,并且 shell 使用一个参数调用您的程序。
我有以下文件:
; hello.s
.section __TEXT,__text
.globl _main
_main:
movl [=11=]x2000001, %eax
movl , %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 [=15=]x2000001, %eax
movl , %edi
syscall
64 位 macOS 上的系统调用使用 System V ABI,因此您需要将第一个参数写入 %edi 而不是 %ebx。就像普通调用一样,系统调用的参数寄存器是 rdi、rsi、rdx、rcx、r8、r9。
目前,您得到 1,因为 rdi 包含 main 的 argc 参数,并且 shell 使用一个参数调用您的程序。