BIOS функции за работа с конзолата Програмиране, уроци и примери
В контекста на нашето изложение, ROM BIOS (Read Only Memory Basic Input Output System) е набор от програми в енергонезависимата памет на компютъра, една от задачите на които е да елиминира спецификите на хардуерните компоненти на компютъра за софтуера, работещ на него, включително операционната система. Поддръжката на клавиатурата и монитора се извършва от BIOS програми, наречени драйвери. Структурно драйверите са съставени от поредица от подпрограми, наречени функции, всяка от които изпълнява специфични действия. Достъпът до функциите на BIOS е подобен на достъпа до функциите на MS DOS. За да работи с клавиатурата и екрана, BIOS съдържа две софтуерни прекъсвания - 16h и 10h, достъпът до които, въз основа на гореизложеното, е извикване на драйверите на тези устройства. За да извикате тези прекъсвания, както обикновено, използвайте инструкцията INT - int 16h или int 10h. За извършване на конкретна операция номерът на функцията се посочва в регистъра AH. При необходимост може да се посочи допълнителна (параметрична) информация в други регистри. По-долу ще разгледаме по-подробно възможностите на BIOS за работа с конзолата.
Функции на BIOS на клавиатурата
Прекъсване 16 BIOS има функции за различни видове клавиатури: обикновена клавиатура 84 клавиша и два вида разширени клавиатури - 101\102 и 122 клавиша. Функция 09p ви позволява да разберете функционалността на клавиатурата:
Вход: AN - 09ч. Изход: AL = битово поле, чиито зададени битове показват поддържаните функции: 7 - запазени; 6 - поддръжка на клавиатура със 122 клавиша (и функции 20h-22h (int 16h)); 5 - поддръжка на разширена клавиатура със 101-102 клавиша (и функции 10h-12h (int 16h)); 4 — поддръжка на функция 0Ah (int 16h); 3 - поддръжка на функцията 030bp (int 16h); 2 - опорафункции 0305h (int 16h); 1 — поддръжка на функция 0304h (int 16h); 0 — поддръжка на функция 0З00п (int 16h).
Преди да извикате тази функция, трябва да се уверите, че се поддържа от тази версия на BIOS. Това може да стане чрез извикване на функцията OcOh interrupt int 15h.
Формат на конфигурационната таблица на ROM:
Пристрастие | Размер | Описание |
00ч | 2 байта | Брой байтове в тази таблица |
02ч | 1 байт | BIOS модел |
03ч | 1 байт | BIOS подмодел |
04ч | 1 байт | Издание на BIOS: 0 - 1-во издание, 1 - 2-ро издание и т.н. |
05ч | 1 байт | 1-ви байт на свойство |
06ч | 1 байт | 2-ри байт на свойство |
07ч | 1 байт | 3-ти байт на свойство |
08ч | 1 байт | 4-ти байт на свойство |
09ч | 1 байт | 5-ти байт на свойство |
Ако бит b от втория байт на свойствата е зададен в резултат на това извикване, тогава BIOS поддържа функцията за прекъсване int 16h 09n, която определя функционалността на клавиатурата.
Вход: AH = 10h, 20h четене на символи с изчакване (съответно за клавиатури със 101-102 и 122 клавиша). Изход: за обикновени ключове (AH = код за сканиране на BIOS; AL = ASCII знак); за разширени кодови ключове и комбинации (AH = разширен ASCII код; AL = 0); за допълнителни ключове (AH - разширен ASCII код; AL = 0Eh). За да въведете символен низ, тези функции трябва да се използват в цикъл. Използвайки примерната програма, показана по-долу, използвайки дебъгер, можете да изследвате съдържанието на AX, когато натискате различни клавиши и техните комбинации.
;prg05_02.asm - асемблерна програма за въвежданениз ;използване на функция за въвеждане на знаци 10h .data низ db 5 dup (0) len_string =$-низ adr_stringdd низ .код mov cx,len_string les di.adr_string ml: mov ah.O10h int 16h stosb цикъл ml
Програмата въвежда 5 знака и ги съхранява в низа str.
Проверка дали символ съществува (01h, 11h, 21h int 16h)
Вход: AH = Olh проверка за наличие на символ (за клавиатура с 84 клавиша). Изход: ако ZF=O, тогава регистрите AH и AL съдържат: за обикновени ключове (AH = код за сканиране на BIOS; AL = ASCII знак); за клавиши и комбинации с разширен ASCII код (AH = разширен ASCII код; AL = 0); ако ZF=1, тогава буферът е празен.
Функция 01h получава информация за символ, без да го чете от буфера на клавиатурата. Изключение е натискането на допълнителни клавиши на разширени клавиатури, които не са съвместими с 83\84-клавишни клавиатури. В процеса на проверка с функцията Olh те се премахват от буфера. Следователно, когато работите с разширени клавиатури, трябва да използвате функции 11h и 21h.
Вход: AH = llh, 21h проверка за наличие на знак (съответно за 101-102- и 122-клавишни клавиатури). Изход: ако ZF=O, тогава регистрите AH и AL съдържат: за обикновени ключове (AH = код за сканиране на BIOS; AL - ASCII символ); за разширени кодови ключове и комбинации (AH = разширен ASCII код; AL = 0); за допълнителни ключове (AH = разширен ASCII код; AL = 0eh); ако ZF=0, тогава буферът е празен. В повечето случаи е логично да започнете работа с резултатите от изпълнението на тази функция, като анализирате ZF флага (с помощта на командите JZ или JNZ). Що се отнася до съдържанието на AX регистъра, то е подобно на съдържанието на 00h int 16h: препратете го: stosb jmpml
Получаване на състоянието на флаговете на клавиатурата (02h, 12h, 22h int 16h)
Писане на знак в буфера на клавиатурата (05h int 16h)
Към командния редMS DOS, трябва да въведете реда: prog_1.exe prog_2.exe >p.txt В резултат на всички тези действия ще бъде създаден p.txt файл, който ще съдържа str низа от файла prog_1.asm.
функции на BIOS на екрана
Екранът се управлява от BIOS, като се използва функцията за прекъсване на 10 часа. Тези функции поддържат текстови и графични режими на монитора. В този раздел ще бъдат разгледани някои функции за извеждане на текст в текстов режим.
Задайте позиция на курсора (02h int 10h)
Получаване на позиция на курсора (03h int 10h)