Нужно написать программу. Засовываешь дискету, включаешь компьютер и показывается сколько у тебя разделов на жёстком диске и какие. Не могу считать с жёсткого диска. Хочу считать МБР, но постоянно возвращается ошибка mov dl, DISK mov dh, 0 mov ch, 0 mov cl, 1 mov ax, 0x290 mov es, ax mov bx, 0 mov al, 1 mov ah, 0x02 int 0x13 jc _read_error В dl что только не совал. (DISK - константа). Заношу туда 0 - с дискеты читается нормально, заношу что-нибудь другое - ошибка. Как считать МБР с жёсткого? Кстати, тестировал на VMware. Может из-за этого?
если у тебя винт один, вероятнее всего его номер будет 80h в любом случае, можешь в цикле последовательно перебирать номера от 80h до FFh
Кури описание 13 инта. Код (Text): 02H Читать секторы Вход: DL = номер диска (0=диск A...; 80H=тв.диск 0; 81H=тв.диск 1) DH = номер головки чтения/записи CH = номер дорожки (цилиндра)(0-n) ◄═╗ CL = номер сектора (1-n) ◄═══════════╩══ См. замечание ниже. AL = число секторов (в сумме не больше чем один цилиндр) ES:BX => адрес буфера вызывающей программы 0:0078 => Таблица параметров дискеты (для гибких дисков) 0:0104 => Таблица параметров тв.диска (для твердых дисков) Выход: Carry-флаг=1 при ошибке и код ошибки диска в AH. ES:BX буфер содержит данные, прочитанные с диска Замечание: на сектор и цилиндр отводится соответственно 6 и 10 бит: 1 1 1 1 1 1 ╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖ CX: ║c c c c c c c c C c S s s s s s║ ╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜ ╚═╩═══► исп. как старшие биты номера цилиндра ╔══════════════════════════════════════════════════════════════════════════════╗ ║ Таблица параметров твердого диска еще ↓ ║ ╚══════════════════════════════════════════════════════════════════════════════╝ Эта 16-байтовая структура находится по адресу вектора прерывания INT 41H 4-байтовый адрес в 0:0104). Параметры для второго твердого диска (если он есть) находятся по адресу вектора INT 46H. Эти таблицы задают некоторые важные пере- менные для операций с твердыми дисками. ■XT■ Переключатели на плате контроллера задают один из четырех типов устройств для каждого твердого диска. Во время загрузки BIOS устанавливает INT 41H и INT 46H в соответствии с состоянием этих переключателей. ▌AT▐ Векторы INT 41H и INT 46H устанавливаются согласно значению "Тип твердого диска" (это переменная CMOS-памяти , загружаемая программой "Setup"). Смещ. Длина Содержимое ▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ┌───────┐ +0 2 │ │ максимальное число цилиндров ├───┼───┘ +2 1 │ │ максимальное число головок ├───┴───┐ +3 2 │ │ starting reduced-write current cylinder ├───┴───┤ +5 2 │ │ starting write precompensation cylinder ├───┼───┘ +7 1 │ │ maximum ECC data burst length ├───┤ ╔═ bit 7: disable disk-access retries +8 1 │ │ drive step options ◄═╣ bit 6: disable ECC retries ├───┤ ╚═ bits 2-0: drive option +9 1 │ │ стандартное значение таймаута ├───┤ +0aH 1 │ │ значение таймаута для форматирования ├───┤ +0bH 1 │ │ значение таймаута для контроля устройства ├───┴───┬───────┐ +0cH 4 │ │ │ (резерв) └───┴───┴───┴───┘ ────────────────────────────────────────────────────────────────────────────────
А если не переходить в защищённый режим, удасться ли считать информацию о всех разделах (расширенных)? Поместиться ли номер цилиндра в 10 бит?
А причем тут защищенный режим? Ф-ии BIOS доступны только в реальном режиме. Правда, есть какое-то 32битное расширение ф-ий BIOS, но не все BIOSы его поддерживают. Можно еще взглянуть на код ошибки (он хранится в AH). Помимо VMWare можно использовать Bochs -- у него есть возможность отладки. И еще потестить на реальной машине, загрузившись с дискеты. Ну, все-таки 63 .
Так значит не получится у меня в реальном режиме прочитать информацию о всех расширеных разделах, если жёсткий больше 8-ми ГБ?
На современных компьютерах получится - их BIOS поддерживает функции 4xh прерывания 13h. Через порты можно работать в любом режиме, но это немного сложнее.