Иллюстрированный самоучитель по задачам и примерам Assembler

Функции BIOS для работы с консолью

Формат конфигурационной ROM-таблицы:

Смещение Размер Описание
00h 2 байта Число байтов в этой таблице
02h 1 байт Модель BIOS
03h 1 байт Подмодель BIOS
04h 1 байт Издание BIOS:
0-1-я редакция,
1-2-я редакция и т. д.
05h 1 байт 1-й байт свойств
06h 1 байт 2-й байт свойств
07h 1 байт 3-й байт свойств
08h 1 байт 4-й байт свойств
09h 1 байт 5-й байт свойств

Если в результате этого вызова бит б второго байта свойств установлен, то BIOS поддерживает функцию 09h прерывания int 16h, с помощью которой определяются функциональные возможности клавиатуры.

Вход: АН = 10h, 20h чтение символа с ожиданием (для 101-102- и 122-клавишных клавиатур соответственно).

Выход: для обычных клавиш (АН = скан-код BIOS; AL = символ ASCII);

  • для клавиш и комбинаций с расширенным кодом (АН = расширенный ASCII-код; AL = 0);
  • для дополнительных клавиш (АН – расширенный ASCII-код; AL = 0Eh).

Для ввода строки символов данные функции необходимо использовать в цикле. На примере показанной ниже программы, используя отладчик, можно исследовать содержимое АХ при нажатии различных клавиш и их комбинаций.

;prg05_02.asm – программа на ассемблере для ввода строки
;с использованием функции ввода символа 10h
.data
string db 5 dup (0) len_string =$-string adr_stringdd string.code
mov cx,len_string
les di.adr_string ml: mov ah.O10h
int 16h
stosb
loop ml

Программа вводит 5 символов и сохраняет их в строке str.

Проверка наличия символа (01h, 11h, 21h int 16h)

Вход: АН = Olh проверка наличия символа (для 84-клавишной клавиатуры).

Выход: если ZF=O, то регистры АН и AL содержат:

  • для обычных клавиш (АН = скан-код BIOS; AL = символ ASCII);
  • для клавиш и комбинаций с расширенным ASCII-кодом (АН = расширенный ASCII-код; AL = 0);
  • если ZF=1, то буфер пуст.

Функция 01h получает информацию о символе, не считывая его из буфера клавиатуры. Исключение составляют нажатия дополнительных клавиш на расширенных клавиатурах, не совместимых с 83\84-клавишными клавиатурами. В процессе проверки функцией Olh они удаляются из буфера. Поэтому при работе с расширенными клавиатурами необходимо использовать функции 11h и 21h.

Вход: АН = llh, 21h проверка наличия символа (для 101-102- и 122-клавишных клавиатур соответственно).

Выход: если ZF=O, то регистры АН и AL содержат:

  • для обычных клавиш (АН = BIOS скан-код; AL – символ ASCII);
  • для клавиш и комбинаций с расширенным кодом (АН = расширенный ASCII-код; AL = 0);
  • для дополнительных клавиш (АН = расширенный ASCII-код; AL = 0eh);
  • если ZF=0, то буфер пуст.

В большинстве случаев работу с результатами выполнения данной функции логично начинать с анализа флага ZF (командами JZ или JNZ). Что же касается содержимого регистра АХ, то оно аналогично содержимому int 16h; пересылаем его:

stosb
jmpml
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.