Sys_read syscall vs. int 0x80 в GNU Assembler

Я пытаюсь написать простую программу, которая захватывает несколько символов из stdin. Для краткости соответствующий код:

mov $3, %rax    # sys_read = 3
mov $0, %rbx    # stdin fd = 0
mov $b, %rcx    # '.lcomm b, 32' declared in .bss section
mov $32,%rdx    # size_t
# syscall
int $0x80

Когда я использую int $0x80, программа функционирует по назначению, однако с syscall она segfaults. Я читал, что это связано с тем, что использование прерывания требует, чтобы ядро ​​запоминало состояние машины, а syscall не соблюдает это требование, то есть ядро ​​обрабатывает его в свое время. Я не уверен, что это настоящая причина - я бы предположил, что syscall что-то делает с такими регистрами, что sys_read терпит неудачу.

Также я прочитал из предыдущего вопроса, что "syscall - это способ ввода ядра по умолчанию" и что "int 0x80 является унаследованным способом вызова системного вызова и его следует избегать". (Ссылка)

Я не могу найти хорошую документацию по этому поводу, поэтому любой ввод будет оценен.

Изменить: опечатка

Ответ 1

Отметьте этот вопрос. На x86_64 правильный системный вызов выхода $60, который должен находиться в %rax.

 mov $60, %rax
 mov $0, %rdi 
 syscall