sys_read syscall против int 0x80 в GNU Assembler

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

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
Другие вопросы по тегам