INT 13h, вземете състоянието на последната операция

Пиша буутлоудър за BIOS в 16-битов реален режим, използвайки qemu като мой емулатор.

Имам някакъв код, който не успява да прочете от моя HD. Това е добре, но това, което всъщност ме притеснява, е, когато се опитвам да получа кода на състоянието от тази операция, използвайки „Получаване на състоянието на последната операция на устройството“.

Според този ресурс на wikipedia, мога просто да задам 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? Очевидно версиите на BIOS се различават по това къде връщат информацията. Освен това наборът CF може да се отнася за факта, че самият статус не е ОК, а не че самата заявка е неуспешна.   -  person Jester    schedule 14.05.2015
comment
Като предложение, може да искате да погледнете какво BIOS поставя в номера на устройството. Забравям дали е в DL или DH при зареждане, но понякога не е това, което очаквате. Това може да доведе до грешката, която виждате, защото устройството всъщност не е 0x80.   -  person David Hoelzer    schedule 14.05.2015
comment
Защо просто не проверите AH, след като Fn 0x02 върна CF set? Ще получите същия резултат   -  person Alexander Zhak    schedule 14.05.2015
comment
@Jester: И аз си помислих това; статията в wikipedia е неясна. @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. След като получих „типът на носителя не е намерен“, разбрах, че проблемът ми е четене извън броя на секторите на виртуалния HD на Qemu. Благодаря! - person James M. Lay; 17.05.2015
comment
За бъдещи справки грешката в Wikipedia беше коригирана. - person I8086; 23.07.2015