macOS Mojave下x86_64汇编的exit系统调用参数是什么?

5

我有以下文件:

; 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

I expect it to be

$ ./run.sh
42

这里出了什么问题?

编辑:

根据zneak的答案,我们需要使用%edi寄存器进行系统调用,因此可正常工作的程序如下:

; hello.s

.section __TEXT,__text
.globl _main
_main:
    movl $0x2000001, %eax
    movl $42, %edi
    syscall

这不是什么大问题,但下次如果你想回答自己的问题,可以直接发布自己的答案,而不是编辑问题并将答案包含在内。请随意发布自己的答案。你可以保留zneak的答案作为“被采纳”的答案(因为他真的值得获得荣誉),但如果你认为你可以进一步阐明这个话题并帮助未来的读者,那么请随意发布自己的答案。 - Rob
1个回答

8

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

当前,您获得了1,因为rdi包含main函数的argc参数,并且shell使用一个参数调用您的程序。


谢谢,我正在阅读的指南完全不准确。是时候找一份新的指南了。 - OregonTrail
祝你好运!顺便说一下,如果你感兴趣的话,你可以使用clang构建.s文件,它也会为你调用链接器:clang -o hello hello.s && ./hello - zneak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接