macOS Mojave上的x86_64程序集退出系统调用参数?

问题描述 投票:4回答:1

我有以下文件:

; 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
macos assembly x86-64 system-calls mach
1个回答
5
投票

64位macOS上的系统调用使用System V ABI,因此您需要将第一个参数写入%edi而不是%ebx。就像普通调用一样,系统调用的参数寄存器是rdi,rsi,rdx,rcx,r8,r9。

目前,你得到1因为rdi包含main的argc参数,而shell用一个参数调用你的程序。

© www.soinside.com 2019 - 2024. All rights reserved.