Параметр системного вызова выхода сборки x86_64 в MacOS Mojave? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть следующий файл:

; 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 Ответ

0 голосов
/ 28 февраля 2019

Системные вызовы на 64-битных macOS используют ABI System V, поэтому вам нужно записать свой первый параметр в% edi вместо% ebx.Как и для обычных вызовов, регистры аргументов для системных вызовов: rdi, rsi, rdx, rcx, r8, r9.

В настоящее время вы получаете 1, потому что rdi содержит параметр argc в main, а оболочка вызывает вашу программус одним аргументом.

...