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.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With