简体   繁体   English

什么会导致Int 13h中的磁盘读取错误?

[英]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: 我一直在NASM中编写一个测试程序,它使用int 13h来读取引导磁盘上的扇区,除非每次用sudo qemu-system-i386 load_disk.bin运行汇编程序时它给我输出:

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. 如果设置了进位标志(CF),则会出现这种情况。 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. 我一直在寻找这个问题的答案,并尝试了很多不同的解决方案(在jc test后跳转到ES:BX ,在DL保存启动驱动器......)但似乎没有任何效果。
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): 当我在Qemu中运行代码时,我遇到了同样的问题,直到我将扇区加载数减少到1(从你的5减去):

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). 通过此更改,您的代码“正常”(不会打印错误消息)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM