私はint 13h
を使用して、組み立てたプログラムを実行するたびにセクタを読み取る機能を、NASMに作成しました。sudo qemu-system-i386 load_disk.binこれは私にこの出力を与えます:Int 13hでディスクの読み取りエラーが発生する原因は何ですか?
ディスク読み取りエラー!ディスクの読み込みエラー!ディスク読み取りエラー!*ディスク読み取りエラー!*ディスク読み取りエラー!*
キャリーフラグ(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
は、この質問を考慮していただき、ありがとうございます。私は本当にしばらくここにいました。
作成されたイメージファイルのサイズはどれくらいですか? 5つのセクタと最初の512バイトのブートセクタを読み込もうとすると、少なくとも6 * 512 = 3072バイトのディスクイメージが必要になります。いくつかのエミュレータでは、ディスクイメージの端を超えて読み取るとエラーになります。ただここで推測する。 _DS_がゼロに設定されることが保証されていないので、あなたは本当に 'org 0x7c00'を使用しているので、_DS_もゼロに設定するべきです。ディスク番号を保存する前に '' xor ax、ax''、 '' ds、ax''を実行してください。 '' 256 dw ''を '' times ''に変更してください。 3072バイトのimae。 –
'INT 13h、2'の後、ディスクの状態は' AH'です - その値は診断的手がかりを与えるかもしれません - それがすべての目的のためです!あなたはエラーメッセージにそれを出力しないといけません。 http://stanislavs.org/helppc/int_13-1.html – Clifford
@ MichaelPetch.Alsoの良いヒント、AHの戻りコードとALの読み取りセクタの数は何ですか? –