Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What would cause a disk read error in Int 13h?

I've been writing a test program in NASM for a function that uses int 13h to read sectors off the booted disk except every time I run the assembled program with sudo qemu-system-i386 load_disk.bin it gives me this output:

disk read error! disk read error! disk read error!* disk read error!* disk read error!*

which is expected if the carry flag (CF) is set. I've been looking for answers to this for days and tried lots of different solutions (jumping to ES:BX after jc test, saving boot drive in DL...) but nothing seems to work.
Here is my program:

[bits 16]                       ;real mode 
[org 0x7c00] 

mov [DISK], dl                  ;save boot drive value 

xor ax, ax                      ;setting up stack 
cli 
mov ss, ax 
mov sp, 0x7c00 
sti 

mov di, 5       `               ;counter for number of tries 
read_disk:                      
mov ah, 0x00                    ;resetting disk 
int 0x13 
mov bx, 0x9000                  ;data buffer 
mov es, bx 
mov bx ,0x0000                   
mov ah, 0x02                    ; function number 2 of int 13h 
mov al, 0x05                    ; read 5 sectors 
mov ch, 0x00                    ; cylinder 0 
mov cl, 0x02                    ; sector 2 (1 is boot sector)   
mov dh, 0x00                    ; head 1 
mov dl, [DISK]                  ; give dl value 
int 0x13                        ; call interrupt 
jc disk_error                    ;if carry flag is set 
jmp 9000h:0000h                
mov bx, [0x9000+512]            ;print bytes as if they were strings 
call print_string 

print_string:                   ; print_string function 
push bx                         
push ax 
loop_one: 
mov ah, 0x0e 
mov al, [bx] 
int 0x10 
cmp al, 0 
je end 
inc bx 
jmp loop_one 
end: 
pop ax 
pop bx 
ret 

disk_error:                    
cmp di, 0                        ; if number of tries=0 jump to loop   
je loop            
push bx                          ;print out the error message      
mov bx, MSG 
call print_string 
pop bx 
dec di                           ;decrementing di 
jmp read_disk 

loop: 
jmp $ 

MSG: 
db 'disk read error!', 0 

DISK: 
db 0 

times 510-($-$$) db 0           ; boot sector padding and BIOS trigger 
dw 0xaa55 
times 256 dw 'D'                ; sectors supposed to be read

Thank you for considering this question. I've really been at this for a while now.

like image 297
Hopeful Avatar asked Oct 29 '22 10:10

Hopeful


1 Answers

I got the same problem when I ran your code in Qemu, until I reduced the sector load count to 1 (from the 5 you had):

mov al, 0x01                    ; read 1 sector

Since your image only has one additional sector, and the emulator treats the image as the entire disk, you can't read any more than the one sector. With this change, your code "works" (doesn't print the error message).

like image 100
davmac Avatar answered Nov 15 '22 12:11

davmac