Я пытаюсь написать простую программу, которая захватывает несколько символов из 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
является унаследованным способом вызова системного вызова и его следует избегать". (Ссылка)
Я не могу найти хорошую документацию по этому поводу, поэтому любой ввод будет оценен.
Изменить: опечатка