BIOS odpowiada zazwyczaj za komunikację między programem a urządzeniami. Udostępnia on zazwyczaj swój interfejs i umożliwia dostęp do sprzętu bez bezpośredniego odwoływania się do niego.
BIOS zawiera sterowniki najczęściej używanych urządzeń, na przykład:
Ponieważ BIOS oferuje większą abstrakcję niż "goły" komputer, używanie jego funkcji w swoich programach gwarantowało kiedyś ich większą przenośność. Dziś system operacyjny komunikuje się raczej bezpośrednio z urządzeniami, by mieć nad nimi większą kontrolę i większy wpływ na szybkość wykonywanych operacji, a programy użytkownika nie korzystają w trybie chronionym z możliwości BIOSu.
BIOS zmienia kilka pozycji w tablicy przerwań wstawiając tam wskaźniki do swoich funkcji. Następnie system operacyjny (lub program, jeżeli system umożliwia wykonywanie przerwań, jak w systemie DOS) wywołuje przerwanie o określonym numerze (int 0xNUMER). W rejestrach ogólnego przeznaczenia przekazywane są parametry funkcji. BIOS wykonuje funkcję i wraca wykonując instrukcję procesora IRET.
Bios trzyma swoje zmienne w specjalnym obszarze pamięci od adresu 0040:0000. Zmienne te można zarówno odczytywać jak i modyfikować. Wywołania funkcji BIOSu mogą powodować ich zmianę, co należy brać pod uwagę przy pisaniu programów zapisujących tam wartości.
W poniższej tabeli znajdują się przykładowe przesunięcia względem adresu 0040:0000 oraz ich znaczenia.
Przesunięcie | Znaczenie |
0x0000 | Adresy wejścia/wyjścia dla portów szeregowych |
0x0008 | Adresy wejścia/wyjścia dla portów równoległych |
0x0017 | Słowo zawierające stan klawiatury |
0x001A | Początek bufora klawiatury |
0x001C | Koniec bufora klawiatury |
0x001E | Bufor klawiatury (32 bajty) |
0x003F | Jeden bajt - stan silników stacji dysków |
0x004E | Początek obrazu ekranu w pamięci karty graficznej |
0x006B | Ostatnie przerwanie sprzętowe, np. bit 5 ustawiony na 1 oznacza wystąpienie przerwania IRQ 5, |
0x0074 | Stan ostatniej operacji dyskowej (po int 0x13), np. 0x4 to błąd "sektor nie istnieje" |
0x0075 | Ilość twardych dysków w systemie |
0x0078 | Przekroczenie czasu oczekiwania w porcie równoległym numer 1 |
0x008B | Bajt konfiguracji stacji dysków, np. bity 7-6 oznaczaja predkosc przesyłu danych do kontrolera (np. 00 - 500 Kbit/sek, 01 - 300 Kbit) |
0x008C | Bajt stanu kontrolera twardego dysku |
0x0096 | Flagi stanu klawiatury, np. bit 3 jest równy 1, gdy wciśnięto prawy klawisz Alt |
0x0097 | Flagi stanu klawiatury, bit 2 to zapalona dioda Caps Lock, bit 1 to dioda Num Lock, bit 0 to dioda Scroll Lock, bit 7 to błąd przesyłu z klawiatury |
Tablica przerwań znajduje się w pamięci operacyjnej na początku pamięci (pod adresem 0) i zajmuje jeden kilobajt. Jest tam 256 wskaźników do funkcji wywoływanych przez przerwania programowe. Każdy wskaźnik zajmuje cztery bajty. Tak jest oczywiście tylko w trybie rzeczywistym.
Poniżej znajduje się tabela z listą przerwań BIOSu.
Numer przerwania |
Opis przerwania |
0x0 | Przerwanie dzielenia przez zero |
0x1 | Praca krok po kroku |
0x2 | Non-maskable interrupt (przerwanie niemaskowalne) |
0x3 | Trap (pułapka), przydatne przy odpluskwianiu |
0x4 | Nadmiar |
0x5 | PrintScreen (Drukowanie ekranu) |
0x6 | Zarezerwowane |
0x7 | Zarezerwowane |
0x8 | IRQ 0 - zegar systemowy |
0x9 | IRQ 1 - klawiatura |
0xA | IRQ 2 - zarezerwowane |
0xB | IRQ 3 - łącze szeregowe 2 |
0xC | IRQ 4 - łącze szeregowe 1 |
0xD | IRQ 5 - łącze równoległe 2 |
0xE | IRQ 6 - sterownik dyskietek |
0xF | IRQ 7 - łącze równoległe 1 |
0x10 | Karta graficzna |
0x11 | Do odczytu konfiguracji |
0x12 | Wielkość pamięci konwencjonalnej |
0x13 | Przerwanie do obsługi dysków twardych |
0x14 | Port szeregowy |
0x15 | Inne funkcje |
0x16 | Funkcje klawiatury |
0x17 | Funkcje drukarki |
0x18 | Wywołanie ekranu konfiguracyjnego BIOSu |
0x19 | Ładowanie systemu operacyjnego |
0x1A | Funkcje dotyczące zegara |
0x1B | Przerwanie Ctrl+Break |
0x1C | Przerwanie zegara czasu rzeczywistego |
0x1D | Ustawienia sterownika graficznego |
0x1E | Ustawienia napędu stacji dysków |
0x1F | Wskaźnik na tablicę rozszerzonych znaków ASCII |
Jak widać, przy pomocy funkcji BIOSu można całkiem dużo zrobić. Całkiem ciekawym zastosowaniem jest programowanie karty VGA - jest to proste, a napisane dla niej programy zadziałają na dowolnym komputerze (uruchomione w trybie rzeczywistym, bo w chronionym zazwyczaj nie ma dostępu do funkcji BIOSu). Oto przykład programu przełączającego kartę VGA w tryb 320x200:
mov ax, 0x13 int 0x10
Później wystarczy jedynie ustawić paletę kolorów i umieszczać wartości w pamięci karty graficznej od adresu 0xA000. Jest to bardzo wygodne i działa z każdą kartą VGA. Z tego powodu powstało wiele programów i gier wykorzystujących tę funkcję BIOSu.