Подтвердить что ты не робот

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;
}

Спасибо.

4b9b3361

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