2017-03-19 9 views
3

私はint 13hを使用して、組み立てたプログラムを実行するたびにセクタを読み取る機能を、NASMに作成しました。sudo qemu-system-i386 load_disk.binこれは私にこの出力を与えます:Int 13hでディスクの読み取りエラーが発生する原因は何ですか?

ディスク読み取りエラー!ディスクの読み込みエラー!ディスク読み取りエラー!*ディスク読み取りエラー!*ディスク読み取りエラー!*

キャリーフラグ(CF)が設定されていると予想されます。私はこの回答を数日間探していて、ES:BXjc 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 

は、この質問を考慮していただき、ありがとうございます。私は本当にしばらくここにいました。

+2

作成されたイメージファイルのサイズはどれくらいですか? 5つのセクタと最初の512バイトのブートセクタを読み込もうとすると、少なくとも6 * 512 = 3072バイトのディスクイメージが必要になります。いくつかのエミュレータでは、ディスクイメージの端を超えて読み取るとエラーになります。ただここで推測する。 _DS_がゼロに設定されることが保証されていないので、あなたは本当に 'org 0x7c00'を使用しているので、_DS_もゼロに設定するべきです。ディスク番号を保存する前に '' xor ax、ax''、 '' ds、ax''を実行してください。 '' 256 dw ''を '' times ''に変更してください。 3072バイトのimae。 –

+0

'INT 13h、2'の後、ディスクの状態は' AH'です - その値は診断的手がかりを与えるかもしれません - それがすべての目的のためです!あなたはエラーメッセージにそれを出力しないといけません。 http://stanislavs.org/helppc/int_13-1.html – Clifford

+0

@ MichaelPetch.Alsoの良いヒント、AHの戻りコードとALの読み取りセクタの数は何ですか? –

答えて

1

私はQEMUでコードを実行したときに、私は(あなたが持っていた5から)1にセクターの負荷数を減少さまで、私は、同じ問題を抱えて:

mov al, 0x01     ; read 1 sector 

あなたのイメージは一つだけ追加の部門を持っているので、エミュレータがイメージをディスク全体として扱う場合、1つのセクタだけを読み取ることはできません。この変更により、コードは「機能します」(エラーメッセージは表示されません)。

+0

1に減らすか、ディスクイメージを3072に増やすだけで十分です。答えの下の私のコメントは 'times 5 * 256 dw 'D''を提案したのはなぜですか?しかし、読んでいるセクタの数がディスクイメージを超えていることが、彼の問題の本当の理由です。私はupvoteです。 –

+0

もうエラーメッセージが表示されないので、両方ともありがとうございます。 – Hopeful

関連する問題