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
                        
  • AL: Код видеорежима (например, 0x03 — текстовый режим 80x25, 16 цветов).
  • Таблица видеорежимов для 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
                            
  • BH: Номер видеостраницы (обычно 0).
  • DH: Номер строки (0 — верхняя строка).
  • DL: Номер столбца (0 — левый столбец).

  • Эта функция выводит символ на экран в текстовом режиме.

    
    mov ah, 0x0E
    mov al, 'A'  ; Символ для вывода
    int 0x10
                            
  • AL: Символ для вывода
  • На основании данного прерывания можно сделать функцию для вывода строки на экран:

    
    print_string:
        mov ah, 0x0E
    .print_char:
        lodsb
        cmp al, 0
        je .done
        int 0x10
        jmp .print_char
    .done:
        ret
                            
  • lodsb загружает байт из адреса, на который указывает регистр SI (Source Index), в регистр AL
  • Мы можем использовать эту функцию вот так:

    
    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 = конечная линия курсора
                            
  • BH: Номер видеостраницы.
  • Возвращает:

  • DH: Номер строки.
  • DL: Номер столбца.
  • CH: Начальная линия курсора.
  • CL: Конечная линия курсора.

  • Получение текущего видеорежима (AH = 0x0F)

    Эта функция возвращает текущий видеорежим и информацию о экране.

    
    mov ah, 0x0F
    int 0x10
    ; AL = текущий видеорежим, AH = количество столбцов, BH = активная видеостраница
                            

    Возвращает:

  • 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!'
                            

    Режим вывода:

  • 0x00: Строка содержит только символы, атрибут задается в BL.
  • 0x01: Строка содержит символы и атрибуты.

  • BH: Номер видеостраницы.
  • BL: Атрибут цвета.
  • CX: Длина строки.
  • DH: Номер строки.
  • DL: Номер столбца.
  • ES:BP: Указатель на строку.

  • Установка шрифта (AH = 0x11)

    Эта функция позволяет установить шрифт для текстового режима.

    
    mov ah, 0x11
    mov al, 0x12  ; Установить шрифт 8x8
    mov bl, 0x00  ; Блок шрифта
    int 0x10
                            
  • AL: Код функции (например, 0x12 — установить шрифт 8x8).
  • BL: Блок шрифта.

  • Определение EGA/VGA (AH = 0x12)

    Эта функция возвращает информацию о EGA/VGA адаптере.

    
    mov ah, 0x12
    mov bl, 0x10  ; Подфункция: получить информацию о EGA/VGA
    int 0x10
    ; BH = видеорежим, BL = объем памяти
                            
  • BL: Подфункция (например, 0x10 — получить информацию о EGA/VGA).
  • Возвращает:

  • 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-код
                            

    Это не полный список BIOS прерываний. Остальные вы можете посмотреть на сайте: BIOS преывания

    © 2025 PRoX development