INT 13h, получить статус последней операции

Я пишу загрузчик для 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 $

person James M. Lay    schedule 13.05.2015    source источник
comment
А что вы получаете в AL и AH? Очевидно, версии биоса отличаются тем, куда они возвращают информацию. Кроме того, набор CF может относиться к тому факту, что сам статус не в порядке, а не к тому, что сам запрос не выполнен.   -  person Jester    schedule 14.05.2015
comment
В качестве предложения вы можете взглянуть на то, что BIOS вводит в номер диска. Я забыл, находится ли он в DL или DH при загрузке, но иногда это не то, что вы ожидаете. Это может привести к ошибке, которую вы видите, потому что диск на самом деле не 0x80.   -  person David Hoelzer    schedule 14.05.2015
comment
Почему бы просто не проверить AH после того, как Fn 0x02 вернул набор CF? Вы получите тот же результат   -  person Alexander Zhak    schedule 14.05.2015
comment
@Jester: я тоже так думал; статья в википедии расплывчата. @DavidHoelzer dl = 0x80 при первом запуске. Кроме того, я могу читать, пока не захватываю более 3 секторов за раз. @AlexanderZhak: Итак, прежде чем я назову 13h, ah = 0x02 и al = 0x05 (читай 5 секторов). После операции чтения ax = 0x0C03.   -  person James M. Lay    schedule 15.05.2015


Ответы (1)


Затем, когда я вызываю int 13h, в AL должен быть код состояния.

Функция BIOS 01h для INT 13h возвращает результат только в регистре AH. Флаг переноса не определен, поэтому после вызова этой функции никогда не следует выполнять проверку на наличие сбоев!

person Sep Roland    schedule 17.05.2015
comment
Потрясающий! Я получаю последовательное поведение, когда я проверяю AH вместо AL. Получив сообщение «тип носителя не найден», я понял, что моя проблема заключалась в чтении за пределами количества секторов на виртуальном жестком диске Qemu. Спасибо! - person James M. Lay; 17.05.2015
comment
Для будущих ссылок ошибка Википедии была исправлена. - person I8086; 23.07.2015