Ответ 1
Отметьте этот вопрос. На x86_64 правильный системный вызов выхода $60
, который должен находиться в %rax
.
mov $60, %rax
mov $0, %rdi
syscall
Я пытаюсь написать простую программу, которая захватывает несколько символов из 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
является унаследованным способом вызова системного вызова и его следует избегать". (Ссылка)
Я не могу найти хорошую документацию по этому поводу, поэтому любой ввод будет оценен.
Изменить: опечатка
Отметьте этот вопрос. На x86_64 правильный системный вызов выхода $60
, который должен находиться в %rax
.
mov $60, %rax
mov $0, %rdi
syscall