Я пишу загрузчик для BIOS в 16-битном реальном режиме, используя qemu в качестве эмулятора.
У меня есть код, который не читается с моего HD. Это нормально, но на самом деле меня беспокоит, когда я пытаюсь получить код состояния этой операции с помощью «Получить статус последней операции с диском».
Согласно этому ресурсу википедии, я могу просто установить для AH значение 1, и установите DL на нужный мне диск (который, как я проверил, 0x80). Затем, когда я вызываю int 13h
, в AL должен быть код состояния.
Однако, когда я это делаю, устанавливается флаг переноса, указывающий, что моя попытка прочитать сам статус не удалась.
Кроме того, что указан неправильный диск, я не понимаю, как он может выйти из строя.
Итак, мой вопрос: какими способами может произойти сбой этой команды (INT 13h, AH 01h)?
Вот мой код:
get_status:
mov ah, 0x01 ; status fxn
mov dl, 0x80 ; 0x80 is our drive
int 0x13 ; call fxn
jc print_status_failure
jmp $
print_status_failure:
mov ax, FAIL_MSG
call print_string
jmp $
AL
иAH
? Очевидно, версии биоса отличаются тем, куда они возвращают информацию. Кроме того, наборCF
может относиться к тому факту, что сам статус не в порядке, а не к тому, что сам запрос не выполнен. - person Jester   schedule 14.05.2015DL
илиDH
при загрузке, но иногда это не то, что вы ожидаете. Это может привести к ошибке, которую вы видите, потому что диск на самом деле не 0x80. - person David Hoelzer   schedule 14.05.2015dl = 0x80
при первом запуске. Кроме того, я могу читать, пока не захватываю более 3 секторов за раз. @AlexanderZhak: Итак, прежде чем я назову 13h,ah = 0x02
иal = 0x05
(читай 5 секторов). После операции чтенияax = 0x0C03
. - person James M. Lay   schedule 15.05.2015