【问题标题】:x86_64 assembly exit system call parameter on macOS Mojave?macOS Mojave 上的 x86_64 程序集退出系统调用参数?
【发布时间】:2019-07-21 17:30:50
【问题描述】:

我有以下文件:

; 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

【问题讨论】:

  • 这没什么大不了的,但是下次您想为您的问题提供答案,而不是编辑您的问题以包含答案时,请随时 post your own answer。继续将 zneak 的答案作为“已接受”的答案(因为他确实值得称赞),但如果您认为可以进一步阐明该主题并帮助未来的读者,请随时发布您自己的答案。

标签: macos assembly x86-64 system-calls mach


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我正在阅读的指南太离谱了。是时候寻找新指南了。
  • 祝你好运!当我们这样做时,如果您对此感兴趣,您可以使用 clang 构建 .s 文件,这也会为您调用链接器:clang -o hello hello.s && ./hello
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 2015-04-05
  • 2014-04-22
  • 2020-04-22
  • 2017-06-18
相关资源
最近更新 更多