Пиша буутлоудър за 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 $
AL
иAH
? Очевидно версиите на BIOS се различават по това къде връщат информацията. Освен това наборът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