Что может вызвать ошибку чтения диска в Int 13h?

Я писал тестовую программу в NASM для функции, которая использует int 13h для чтения секторов с загрузочного диска, за исключением того, что каждый раз, когда я запускаю собранную программу с помощью sudo qemu-system-i386 load_disk.bin, она выдает мне следующее:

ошибка чтения диска! ошибка чтения диска! Ошибка чтения диска!* Ошибка чтения диска!* Ошибка чтения диска!*

что ожидается, если установлен флаг переноса (CF). Я искал ответы на эти вопросы в течение нескольких дней и перепробовал множество различных решений (переход к ES:BX после jc test, сохраняя загрузочный диск в DL...) но ничего не работает.
Вот моя программа:

[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

Спасибо за рассмотрение этого вопроса. Я действительно был этим некоторое время.

1 ответ

Решение

У меня возникла та же проблема, когда я запускал ваш код в Qemu, пока я не уменьшил счетчик загрузки сектора до 1 (из 5, которые у вас были):

mov al, 0x01                    ; read 1 sector

Поскольку у вашего образа есть только один дополнительный сектор, а эмулятор обрабатывает образ как весь диск, вы не можете прочитать больше, чем один сектор. С этим изменением ваш код "работает" (не печатает сообщение об ошибке).

Другие вопросы по тегам