Вопрос

Почему это печатает мусор вместо корректного выхода из моей программы?Я использую таким образом системные вызовы в 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??
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top