Это можно сделать из сборки, но это нелегко. Вы не можете использовать int 21h, это системный вызов DOS, и он не доступен в Linux.
Чтобы получить символы из терминала в UNIX-подобных операционных системах (таких как Linux), вы читаете из STDIN (номер файла 0). Обычно системный вызов чтения блокируется, пока пользователь не нажмет ввод. Это называется каноническим режимом. Чтобы прочитать один символ, не дожидаясь нажатия клавиши ввода, сначала необходимо отключить канонический режим. Конечно, вам нужно будет снова включить его, если вы хотите, чтобы ввод строки происходил позже и до выхода из программы.
Чтобы отключить канонический режим в Linux, вы отправляете IOCTL (IO ControL) в STDIN, используя системный вызов ioctl. Я предполагаю, что вы знаете, как выполнять системные вызовы Linux от ассемблера.
Системный вызов ioctl имеет три параметра. Первый - это файл для отправки команды (STDIN), второй - номер IOCTL, а третий - обычно указатель на структуру данных. ioctl возвращает 0 в случае успеха или отрицательный код ошибки при ошибке.
Первый IOCTL, который вам нужен, это TCGETS (номер 0x5401), который получает текущие параметры терминала в структуре termios. Третий параметр - это указатель на структуру termios. Исходя из источника ядра, структура termios определяется как:
struct termios {
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
};
где tcflag_t имеет длину 32 бита, cc_t имеет длину одного байта, а NCCS в настоящее время определено как 19. Смотрите руководство NASM, чтобы узнать, как вы можете удобно определить и зарезервировать пространство для подобных структур.
Так что, как только вы получите текущие термины, вам нужно очистить канонический флаг. Этот флаг находится в поле c_lflag с маской ICANON (0x00000002). Чтобы очистить его, вычислите c_lflag AND (НЕ ICANON). и сохраните результат обратно в поле c_lflag.
Теперь вам нужно уведомить ядро о ваших изменениях в структуре termios. Используйте TCSETS (номер 0x5402) ioctl, а третий параметр задает адрес вашей структуры termios.
Если все идет хорошо, терминал теперь находится в неканоническом режиме. Вы можете восстановить канонический режим, установив канонический флаг (используя ORing c_lflag с ICANON) и снова вызвав TCSETS ioctl. всегда восстанавливать канонический режим перед выходом
Как я уже сказал, это не легко.