Предыдущий раздел | НАЧАЛЬНЫЕ ЗАГРУЗЧИКИ | Следующий раздел |
Первичный начальный загрузчик занимает первый сектор логического диска длиной 512 байт и имеет следующую укрупненную структуру:
org 7c00h ; Смещение относительно начала сегмента ОП
jmp near Begin ; Переход на начало кода
; Описательный блок
B_1 times 8 db 0 ; Название ОС
B_2 dw 0 ; Размер сектора (байт)
. . . . . . . .
; Другие данные программы
Begin: ; Начало кода
. . . . . . . . ; Команды загрузчика
. . . . . . . .
; Заполнение оставшегося места в секторе нулями с целью точного
; размещения загрузочной сигнатуры
times 510-($-$$) db 0
; Загрузочный сектор заканчивается загрузочной сигнатурой
boot_signature: dw 0aa55h
По относительному адресу 7c00h находится 3-байтовая команда перехода jmp, которая «перескакивает» через описательный блок загрузочного сектора на исполнительные команды (код) загрузчика. Описательный блок загрузочного сектора имеет длину 64 байта и содержит информацию об используемой файловой системе и о размещении информации на диске. Содержание описательного блока для FAT12 и FAT16 приведено в табл.10.
Т а б л и ц а 10. Структура описательного блока
Первоначальная запись в описательный блок производится транслятором в результате обычной инициализации данных. После того, как первичный загрузчик будет записан программой POST BIOS в ОП, POST BIOS может, прежде, чем передать управление первичному загрузчику, заменить содержимое некоторых полей в описательном блоке. При этом особый интерес представляет запись в поле 14 (номер дискового устройства). Некоторые BIOS записывают в это поле сам номер дисковода. Другие BIOS помещают в это поле число FFh, а номер дисковода передают на вход первичного загрузчика в регистре DL.
Последние два байта загрузочного сектора содержат загрузочную сигнатуру (слово) – AA55h (в младшем байте – 55h, в старшем байте – AAh). Если POST BIOS обнаружит это слово в конце первого сектора логического диска, то он будет считать этот диск загрузочным.
Рассмотрим записанный перед загрузочной сигнатурой псевдооператор
times 510-($-$$) db 0
Его наличие обеспечивает точное размещение загрузочной сигнатуры в двух последних байтах загрузочного сектора. Данный оператор «вычисляет» расстояние между кодом загрузчика и предпоследним байтом загрузочного сектора и заполняет это пространство памяти нулями. В самом деле, $ – смещение текущей команды относительно начала сегмента ОП. $$ – тоже смещение, но начала кода программы, то есть смещение, заданное в операторе org. Таким образом, ($-$$) есть размер программы (в байтах) до текущей позиции.
Предыдущий раздел | В начало | Следующий раздел |