BIOS прерывания
BIOS прерывания
Прерывания BIOS выступают в роли интерфейса для работы с оборудованием (то есть мы можем почти как угодно работать с "железяками", стоящими в нашем компьютере).
Для вызова прерываний BIOS'а программа или операционная система, работающая в Real Mode, может использовать ассемблерную инструкцию int
.
Ей мы сегодня и будем пользоваться.
Навигация по прерываниям:
INT 0x10
Прерывание INT 10h — это одно из основных прерываний BIOS, предназначенное для работы с видеорежимами и управлением выводом на экран. Оно предоставляет набор функций, которые позволяют управлять текстовыми и графическими режимами, перемещать курсор, изменять цвета, шрифты и выполнять другие операции, связанные с видеовыводом.
Навигация по функциям INT 0x10:
Установка видеорежима (AH = 0x00)
Эта функция позволяет установить видеорежим. Видеорежим определяет разрешение, количество цветов и тип вывода (текстовый или графический).
mov ah, 0x00
mov al, 0x03 ; Установить текстовый режим 80x25, 16 цветов
int 0x10
Таблица видеорежимов для INT 10h, AH = 0x00
Режим (AL) | Тип | Разрешение | Цвета | Описание |
---|---|---|---|---|
0x00 | Текстовый | 40x25 | 16/8 | Текстовый режим, 40 столбцов, 25 строк, 16 цветов (CGA) |
0x01 | Текстовый | 40x25 | 16/8 | Текстовый режим, 40 столбцов, 25 строк, 16 цветов (CGA) |
0x02 | Текстовый | 80x25 | 16/8 | Текстовый режим, 80 столбцов, 25 строк, 16 цветов (CGA) |
0x03 | Текстовый | 80x25 | 16/8 | Текстовый режим, 80 столбцов, 25 строк, 16 цветов (CGA) |
0x04 | Графический | 320x200 | 4 | Графический режим, 320x200, 4 цвета (CGA) |
0x05 | Графический | 320x200 | 4 | Графический режим, 320x200, 4 цвета (CGA) |
0x06 | Графический | 640x200 | 2 | Графический режим, 640x200, 2 цвета (CGA) |
0x07 | Текстовый | 80x25 | Монохромный | Текстовый режим, 80 столбцов, 25 строк, монохромный (MDA) |
0x0D | Графический | 320x200 | 16 | Графический режим, 320x200, 16 цветов (EGA) |
0x0E | Графический | 640x200 | 16 | Графический режим, 640x200, 16 цветов (EGA) |
0x0F | Графический | 640x350 | Монохромный | Графический режим, 640x350, монохромный (EGA) |
0x10 | Графический | 640x350 | 16 | Графический режим, 640x350, 16 цветов (EGA) |
0x11 | Графический | 640x480 | 2 | Графический режим, 640x480, 2 цвета (VGA) |
0x12 | Графический | 640x480 | 16 | Графический режим, 640x480, 16 цветов (VGA) |
0x13 | Графический | 320x200 | 256 | Графический режим, 320x200, 256 цветов (VGA) |
Установка позиции курсора (AH = 0x02)
Эта функция перемещает курсор (белое нижнее подчёркивание) в указанную позицию на экране.
mov ah, 0x02
mov bh, 0x00 ; Видеостраница (обычно 0)
mov dh, 0x0A ; Строка (0–24)
mov dl, 0x14 ; Столбец (0–79)
int 0x10
Вывод символа на экран (AH = 0x0E)
Эта функция выводит символ на экран в текстовом режиме.
mov ah, 0x0E
mov al, 'A' ; Символ для вывода
int 0x10
На основании данного прерывания можно сделать функцию для вывода строки на экран:
print_string:
mov ah, 0x0E
.print_char:
lodsb
cmp al, 0
je .done
int 0x10
jmp .print_char
.done:
ret
Мы можем использовать эту функцию вот так:
mov si, msg ; msg - строка для вывода
call print_string ; Вызываем функцию
msg db 'Hello, world!', 0 ; Обьявление строки
Получение позиции курсора (AH = 0x03)
Эта функция возвращает текущую позицию курсора.
mov ah, 0x03
mov bh, 0x00 ; Видеостраница (обычно 0)
int 0x10
; DH = строка, DL = столбец, CH = начальная линия курсора, CL = конечная линия курсора
Возвращает:
Получение текущего видеорежима (AH = 0x0F)
Эта функция возвращает текущий видеорежим и информацию о экране.
mov ah, 0x0F
int 0x10
; AL = текущий видеорежим, AH = количество столбцов, BH = активная видеостраница
Возвращает:
Вывод строки (AH = 0x13)
Эта функция выводит строку на экран.
mov ah, 0x13
mov al, 0x01 ; Режим вывода (атрибут в BL)
mov bh, 0x00 ; Видеостраница (опционально)
mov bl, 0x07 ; Атрибут цвета (опционально)
mov cx, 0x0A ; Длина строки (опционально)
mov dh, 0x0A ; Строка (опционально)
mov dl, 0x14 ; Столбец (опционально)
mov bp, message ; Указатель на строку
int 0x10
message db 'Hello, OS!'
Режим вывода:
Установка шрифта (AH = 0x11)
Эта функция позволяет установить шрифт для текстового режима.
mov ah, 0x11
mov al, 0x12 ; Установить шрифт 8x8
mov bl, 0x00 ; Блок шрифта
int 0x10
Определение EGA/VGA (AH = 0x12)
Эта функция возвращает информацию о EGA/VGA адаптере.
mov ah, 0x12
mov bl, 0x10 ; Подфункция: получить информацию о EGA/VGA
int 0x10
; BH = видеорежим, BL = объем памяти
Возвращает:
Работа с VESA (AH = 0x4F)
VESA (Video Electronics Standards Association) предоставляет расширенные функции для работы с видеорежимами.
Получение информации о VESA (AX = 0x4F00)
mov ax, 0x4F00
mov di, buffer ; Указатель на буфер для информации
int 0x10
buffer times 256 db 0
Выбор видеорежима VESA (AX = 0x4F02)
mov ax, 0x4F02
mov bx, 0x101 ; Режим 0x101 (640x480, 256 цветов)
int 0x10
Пример использования INT 10h
Пример программы на NASM, которая выводит строку на экран:
org 0x7C00 ; Загрузчик начинается с адреса 0x7C00
start:
mov ah, 0x00 ; Установить видеорежим
mov al, 0x03 ; Текстовый режим 80x25, 16 цветов
int 0x10
mov ah, 0x13 ; Вывод строки (можно заменить вышеуказанной функцией print_string)
mov al, 0x01 ; Режим вывода
mov bh, 0x00 ; Видеостраница
mov bp, message ; Указатель на строку
int 0x10
jmp $ ; Бесконечный цикл
message db 'Hello, World!'
times 510-($-$$) db 0
dw 0xAA55 ; Сигнатура загрузчика
INT 0x13
Прерывание INT 13h предназначено для работы с дисками. Оно предоставляет функции для чтения и записи секторов, сброса контроллеров дисков и получения информации о дисках.
Навигация по функциям INT 0x13:
Сброс дискеты/жёсткого диска (AH = 0x00)
Эта функция сбрасывает контроллер диска.
Сброс контроллера диска - это низкоуровневая операция, которая восстанавливает состояние контроллера диска (например, флоппи-дисковода или жесткого диска) в исходное состояние. Это может быть полезно, если произошла ошибка при работе с диском, и нужно восстановить его работоспособность.
mov ah, 0x00
mov dl, 0x00 ; Диск 0 (A:)
int 0x13
Чтение секторов с диска в режиме CHS (AH = 0x02)
Эта функция читает сектора с диска в режиме CHS (Cylinder-Head-Sector).
mov ah, 0x02
mov al, 0x01 ; Количество секторов для чтения
mov ch, 0x00 ; Цилиндр 0
mov cl, 0x01 ; Сектор 1
mov dh, 0x00 ; Головка 0
mov dl, 0x00 ; Диск 0 (A:)
mov bx, buffer ; Указатель на буфер для данных
int 0x13
buffer times 512 db 0
Запись секторов на диск в режиме CHS (AH = 0x03)
Эта функция записывает секторы на диск в режиме CHS.
mov ah, 0x03
mov al, 0x01 ; Количество секторов для записи
mov ch, 0x00 ; Цилиндр 0
mov cl, 0x01 ; Сектор 1
mov dh, 0x00 ; Головка 0
mov dl, 0x00 ; Диск 0 (A:)
mov bx, buffer ; Указатель на буфер с данными
int 0x13
buffer db 0x55, 0xAA ; Пример данных для записи
Определение второго диска (AH = 0x15)
Эта функция определяет наличие второго диска.
mov ah, 0x15
mov dl, 0x80 ; Диск 0x80 (первый жёсткий диск)
int 0x13
; AH содержит тип диска, CX:DX содержит количество секторов
Проверка наличия расширений INT 13 (AH = 0x41)
Эта функция проверяет наличие расширений INT 13.
mov ah, 0x41
mov bx, 0x55AA ; Магическое число
mov dl, 0x80 ; Диск 0x80 (первый жёсткий диск)
int 0x13
; Если CF = 0, то расширения поддерживаются
Чтение секторов с диска в режиме LBA (AH = 0x42)
Эта функция читает секторы с диска в режиме LBA (Logical Block Addressing).
mov ah, 0x42
mov dl, 0x80 ; Диск 0x80 (первый жёсткий диск)
mov si, dap ; Указатель на структуру DAP
int 0x13
dap:
db 0x10 ; Размер структуры DAP
db 0x00 ; Зарезервировано
dw 0x01 ; Количество секторов для чтения
dw buffer ; Смещение буфера
dw 0x0000 ; Сегмент буфера
dd 0x00000001 ; Начальный LBA
dd 0x00000000 ; Старшие 32 бита LBA
buffer times 512 db 0
Запись секторов на диск в режиме LBA (AH = 0x43)
Эта функция записывает секторы на диск в режиме LBA.
mov ah, 0x43
mov dl, 0x80 ; Диск 0x80 (первый жёсткий диск)
mov si, dap ; Указатель на структуру DAP
int 0x13
dap:
db 0x10 ; Размер структуры DAP
db 0x00 ; Зарезервировано
dw 0x01 ; Количество секторов для записи
dw buffer ; Смещение буфера
dw 0x0000 ; Сегмент буфера
dd 0x00000001 ; Начальный LBA
dd 0x00000000 ; Старшие 32 бита LBA
buffer db 0x55, 0xAA ; Пример данных для записи
INT 0x15
Прерывание INT 15h используется для работы с памятью и управления различными аспектами системы, такими как Power Management и другие функции.
Навигация по функциям INT 0x15:
Получение объема низкой памяти (AH = 0x12)
Эта функция возвращает объем низкой памяти в килобайтах.
Низкая память — это первые 640 КБ оперативной памяти (ОЗУ) в архитектуре IBM PC-совместимых компьютеров.
int 0x12
; AX содержит объем низкой памяти
Получение карты памяти (EAX = 0xE820)
Эта функция возвращает карту памяти системы.
mov eax, 0xE820
mov edx, 0x534D4150 ; Магическое число 'SMAP'
mov ecx, 24 ; Размер буфера
mov di, buffer ; Указатель на буфер
int 0x15
buffer times 24 db 0
Получение непрерывного размера памяти (AX = 0xE801)
Эта функция возвращает непрерывный размер памяти.
mov ax, 0xE801
int 0x15
; AX содержит объем памяти между 1МБ и 16МБ, BX содержит объем памяти выше 16МБ
INT 0x16
Прерывание INT 16h используется для работы с клавиатурой. Оно предоставляет функции для считывания нажатий клавиш, установки частоты повторения и других операций.
Навигация по функциям INT 0x16:
Считывание кода клавиатуры с блокировкой (AH = 0x00)
Эта функция считывает код клавиши с блокировкой (ожидает нажатия клавиши).
mov ah, 0x00
int 0x16
; AH содержит скан-код, AL содержит ASCII-код
Считывание кода клавиатуры без блокировки (AH = 0x01)
Эта функция считывает код клавиши без блокировки (не ожидает нажатия клавиши).
mov ah, 0x01
int 0x16
; Если ZF = 0, то AH содержит скан-код, AL содержит ASCII-код