Syscall от inline asm в x86_64 Linux?
Почему этот отпечаток мусора вместо того, чтобы изящно выйти из моей программы? Я использую системные вызовы таким образом на BSD, и мне интересно, что мне нужно, чтобы заставить его работать в Linux.
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
Спасибо.
Ответы
Ответ 1
Почему этот отпечаток мусора вместо того, чтобы выйти из моей программы изящно?
Per CESA-2009-001, "Syscall 1 - это выход на i386, но запись на x86_64".
что мне нужно, чтобы он работал в Linux
Использовать ординалы syscall из текущего unistd_64.h
Надеюсь, это поможет!
Ответ 2
Syscall 1 - это выход на i386, но запись на x86-64 я верю.
EDIT: это кажется неточным:
Согласно веб-сайту, который, похоже, не слишком много информации о сборке Linux x86-64, это, по-видимому, является ожидаемой установкой регистра до команды syscall.
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??