2015-05-13 3 views
2

Я пишу загрузчик для BIOS в 16-битном реальном режиме, используя qemu в качестве моего эмулятора.INT 13h, получить статус последнего оп

У меня есть код, который не читается с моего HD. Это нормально, но меня действительно беспокоит, когда я пытаюсь получить код состояния из этой операции, используя «Получить статус последней операции с приводом».

Согласно this wikipedia resource, я могу просто установить 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 $ 
+1

И что вы получаете в 'AL' и' AH'? По-видимому, версии BIOS отличаются тем, где они возвращают информацию. Кроме того, набор 'CF' может относиться к тому факту, что сам статус не в порядке, а не сам запрос. – Jester

+0

В качестве предложения вы можете взглянуть на то, что BIOS вводит в номер накопителя. Я забыл, что он находится в 'DL' или' DH' при загрузке, но иногда это не то, что вы ожидаете. Это может привести к ошибке, которую вы видите, потому что диск фактически не равен 0x80. –

+1

Почему бы просто не проверить AH после возврата Fn 0x02 CF? Вы получите тот же результат –

ответ

2

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

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

+1

Удивительный! Я получаю постоянное поведение, когда проверяю AH вместо AL. После получения типа «media type not found» я понял, что моя проблема заключается в чтении за пределами количества секторов виртуального HD-видео Qemu. Благодаря! –

+0

Для будущих ссылок исправлена ​​ошибка в Википедии. – I8086

Смежные вопросы