int 0x80
Инструкции int
, sysenter
и syscall
являются специальными вариантами инструкции call
:
Эти инструкции вызывают специальную функцию, так называемый «обработчик».
int 0x80
- это обработчик в операционной системе Linux, предназначенный для 32-битных программ Linux. Вызов int 0x80
из 64-битных программ (и ваша программа, очевидно, является 64-битной) может работать, но может также не работать.
В 64-битном Linux вы используете syscall
вместо int 0x80
. Системный вызов exit
должен (*) выглядеть следующим образом:
mov $60, %rax # In 64-bit Linux sys_exit is 60, not 1
mov $0, %rdi # Exit code; this would be %ebx in 32-bit Linux
syscall
int 0x16
- это обработчик в BIOS. Вы можете вызывать обработчики BIOS только из 16-битных программ реального режима (**). Вы не можете вызвать этот обработчик ни из 32-, ни из 64-битных программ.
(*) К сожалению, я написал программы на ассемблере только для 32-битного Linux, поэтому я не уверен, что это правильно.
(**) CPU поддерживает два разных режима работы при выполнении 16-битного кода. Обработчики BIOS будут работать только в одном из этих двух режимов.
ждать клавиатуры
В Linux нет явных функций клавиатуры.
Вы должны использовать функции termios
, чтобы переключить поведение дескриптора файла stdin
(дескриптор файла 0). В ассемблере это будет сделано вызовом sys_ioctl
.
По умолчанию Linux обрабатывает ввод по линии (например, если вы нажмете «AB» + «backspace» + «CD» + «enter», Linux вернет «ACD» + «enter» программе) .
Поведение по умолчанию также заключается в том, что sys_read
будет ждать, пока не станут доступны некоторые данные. Используя termios
, вы можете изменить это поведение так, чтобы все нажатия клавиш возвращались программе и / или что sys_read
не будет ждать ввода.
Затем вы звоните sys_read
, чтобы прочитать с stdin
.