Восстановление данных. Практическое руководство, стр. 27
CMP byte [SI+4], 05h JZ LOAD_CHS_EXT ; Это расширенная таблица разделов ; в формате CHS CMP byte [SI+4], 0Fh JZ LOAD_LBA_EXT ; Это расширенная таблица разделов ; в формате LBA ADD SI, 10h ; Переходим на следующий раздел CMP SI, 1EEh JNA read_all_partitions ; Читаем все разделы один за другим...buf rb 512 ; Буфер на 512 байтЗапись сектора в режиме CHS происходит практически точно так же, только регистр
AH02h03hЧтение сектора осуществляется функцией
42hAH = 42hDLDS:SIТаблица 5.4. Формат адресного пакета, используемый для чтения и записи секторов в режиме LBA
| Смещение | Тип | Описание |
|---|---|---|
00h | BYTE | Размер пакета — 10h18h |
01h | BYTE | Поле зарезервировано и должно быть равно нулю |
02h | WORD | Сколько секторов читать |
04h | DWORD | 32-разрядный адрес буфера-приемника в формате seg:offs |
08h | QWORD | Стартовый номер сектора для чтения |
10h | QWORD | 64-разрядный плоский адрес буфера-приемника. Используется только в случае, если 32-разрядный адрес равен FFFF:FFFF |
Код, читающий сектор в режиме LBA, в общем случае выглядит так, как показано в листинге 5.7.
Листинг 5.7. Код, осуществляющий чтение сектора с диска в режиме LBA
MOV DI, 1BEh ; Перейти к первому разделуMOV AX, CS ; Настраиваем...MOV buf_seg ; ...сегментMOV EAX, [DI+08h] ; Смещение partition относительно ; начала разделаADD EAX, EDI ; EDI должен содержать номер сектора ; текущего MBRMOV [X_SEC] ;...read_all_partitions: MOV АН, 42h ; Читать сектор в режиме LBA MOV DL, 80h ; Читать с первого диска MOV SI, dap ; Смещение адресного пакета INT 13h JC error ; Ошибка чтения...dap:packet_size db 10h ; размер пакета 10h байтreserved db 00h ; "Заначка" для будущих расширенийN_SEC dw 01h ; Читаем один секторbuf_seg dw 00h ; Сюда будет занесен сегмент буфера-приемникаbuf_off dw buf ; Смещение буфера-приемникаX_SEC dd 0 ; Сюда будет занесен номер сектора для чтенияdd 0 ; Реально не используемый хвост ; 64-битного адресаbuf rb 512 ; Буфер на 512 байтЗапись осуществляется аналогично чтению, только регистр
AH42h43hALALТеперь, освоившись с дисковыми прерываниями, перейдем к обсуждению остальных аспектов программирования.
Лучше всего загрузчики программируются на FASM. С точки зрения ассемблера загрузчик представляет собой обыкновенный двоичный файл, предельно допустимый объем которого составляет
1BBhn == sectors per track443 + 63*512 == 32 699Как уже говорилось, BIOS загружает MBR по адресу
7C00hORG 7C00hUSE16