Системный вызов из встроенного asm в x86_64 Linux?
-
05-07-2019 - |
Вопрос
Почему это печатает мусор вместо корректного выхода из моей программы?Я использую таким образом системные вызовы в BSD, и мне интересно, что мне нужно, чтобы это работало в Linux.
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
Спасибо.
Решение
Почему это печатает мусор вместо корректного выхода из моей программы?
Пер CESA-2009-001, «Системный вызов 1 — выход на i386, но запись на x86_64».
что мне нужно, чтобы это работало в Linux
Используйте порядковые номера системных вызовов из текущего unistd_64.h
Надеюсь это поможет!
Другие советы
Системный вызов 1 - это выход на i386, но я думаю, что запись на x86-64.
РЕДАКТИРОВАТЬ:это кажется неточным:Согласно Интернету, в котором, похоже, не так уж много информации о сборке Linux x86-64, это, по-видимому, ожидаемая настройка регистра перед инструкцией системного вызова.
rax system call number
rbx arg0
rcx return address from syscall
rdx arg2
rsi arg3
rdi arg4
r8 arg5
r9 arg1 (expected by gcc in %rcx)
r10-r15 should be saved/restored by C code
rbp dito What is dito??