Параметр системного вызова выхода сборки x86_64 в MacOS Mojave?
У меня есть следующий файл:
; 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
1 ответ
Решение
Системные вызовы в 64-битных macOS используют ABI System V, поэтому вам нужно записать свой первый параметр в%edi вместо%ebx. Как и для обычных вызовов, регистры аргументов для системных вызовов - это rdi, rsi, rdx, rcx, r8, r9.
В настоящее время вы получаете 1, потому что rdi содержит параметр argc в main, а оболочка вызывает вашу программу с одним аргументом.