Системный вызов из встроенного asm в Linux x86_64? - PullRequest
12 голосов
/ 30 июля 2009

Почему это печатает мусор вместо изящного выхода из моей программы? Я использую системные вызовы таким образом в BSD, и мне интересно, что мне нужно, чтобы это работало в Linux.

int
main(int argc, char **argv)
{
    __asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
    return 0;
}

Спасибо.

Ответы [ 2 ]

13 голосов
/ 30 июля 2009

Почему это печатает мусор вместо изящного выхода из моей программы?

За CESA-2009-001 , «Syscall 1 - выход на i386, но запись на x86_64».

что мне нужно, чтобы это работало в Linux

Используйте порядковые номера системных вызовов из текущего unistd_64.h

Надеюсь, это поможет!

3 голосов
/ 30 июля 2009

Syscall 1 - выход на i386, но я пишу на x86-64, я верю.

РЕДАКТИРОВАТЬ: это кажется неточным: Согласно Интернету, который, кажется, не имеет слишком много информации о сборке 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??
...