ассемблер (fasm) - прочитать символ

функция прерывания биоса 21h (ah = 1h) должна считывать символ со стандартного ввода и повторять его.

Моя функция чтения:

    mov ah, 1h
    int 21h

Итак, если я нажму клавишу, он это поймет, но не будет повторять символ. Поскольку я использую свой код для загрузки его с моей дискеты и функцию эха символов int 10h (ah = 0eh), я думаю, что мне нужно сохранить его, а затем повторить его с помощью «видео - вывод телетайпа» (int 10h (ah = 0eh )).

Или я что-то пропустил в коде абоце?


person user1571682    schedule 16.09.2012    source источник
comment
Что вы имеете в виду под загрузкой с моей дискеты, вы имеете в виду, что пишете свой собственный загрузчик или загрузочный диск DOS (мое предположение основано на использовании прерывания DOS int 21h в вашем коде)? Ответ зависит от среды, для которой вы пишете свой код.   -  person nrz    schedule 16.09.2012


Ответы (2)


Прерывание 0x21 — это «интерфейс» к функциям ОС, подобным MSDOS, а не к BIOS.

Если вы пишете загрузчик реального режима или маленькое ядро ​​ОС, вы должны использовать свой собственный обработчик IRQ 1.

См. этот ответ, чтобы узнать, как зафиксировать все нажатия клавиш в вашем собственном буфере памяти: Как проверить состояние ключей в сборке x86?

Тогда вам придется устроить своего рода петлю. Вы проверяете нажатие клавиши (прочитав буфер памяти). Как только нажатие клавиши обнаружено, чтобы напечатать «эхо» клавиши, вам нужно что-то записать в видеопамять. Это другая история. Если вы используете текстовый режим по умолчанию, просто напишите в сегмент 0xB800. Если вы используете графический режим (VGA или VESA), вам нужно откуда-то взять растровый шрифт.

Если вы пишете что-то на ассемблере на уровне загрузчика, доступно немногое. Определенно не int 0x21.

person Viktor Latypov    schedule 17.09.2012

Вы в основном делаете две разные вещи:

  1. получение символа с клавиатуры
  2. Отображение его на экране

Задействовано два разных прерывания BIOS, но, к счастью, оба используют одно и то же значение в AL.

mov ah,0h   ;get character from keyboard
int 16h     ;and store it in AL
mov ah,0eh  ;Display a character in AL
int 10h     ;aka, echo it

INT 21h — это штука для MSDOS, что недопустимо, если мы говорим о загрузчике.

person Soffian A.R    schedule 27.01.2014