Syscall из встроенного asm в x86 64 Linux?

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

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

спасибо.

2 ответов


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

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

что мне нужно, чтобы заставить его работать в Linux

используйте ординалы syscall из текущего unistd_64.h

надеюсь, что это помогает!


Syscall 1-это выход на i386, но я считаю, что пишу на x86-64.

EDIT: это кажется неточным: Согласно веб-сайту, который, похоже, не имеет слишком много информации о сборке x86-64 Linux, это, похоже, ожидаемая настройка регистра перед инструкцией 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??