にセクタをロードしている間、私はthisを使用して、ブートローダーを開発しようとしましたが、それが実行されたときには示していますディスク読み取りエラーメモリ
disk read error!
私はそれを無視した場合、以降の部分では、それは間違ったメモリを私に示してマッピング。私はまた他のいくつかの情報源にも従っていましたが、無駄でした。彼らがやっていることをコピーしているような気がする。私が少しでも異なっていても、毎回新しい種類のエラーが発生します。
既にビルドされているブートローダを使用する必要がありますか?
ディスク負荷エラーのコードは以下の通りです:
[org 0x7c00]
KERNEL_OFFSET equ 0x1000
mov [BOOT_DRIVE], dl
mov bp, 0x9000
mov sp, bp
mov bx, MSG_REAL_MODE
call print_string
call load_kernel
jmp $
print_string:
pusha
mov ah, 0x0e
loop:
mov al,[bx]
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
disk_load:
push dx
mov ah, 0x02
mov al, dh
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
jc disk_error
pop dx
cmp dh, al
jne disk_error
ret
disk_error :
mov bx, DISK_ERROR_MSG
call print_string
jmp $
DISK_ERROR_MSG db "Disk read error!", 0
[bits 16]
load_kernel:
mov bx, KERNEL_OFFSET
mov dh, 15
mov dl, [BOOT_DRIVE]
call disk_load
ret
; Global variables
BOOT_DRIVE db 0
MSG_REAL_MODE db "Started in 16-bit Real Mode", 0
; Bootsector padding
times 510-($-$$) db 0
dw 0xaa55
は、私は私のブートローダを組み立て、実行するには、このコマンドを使用します。
nasm boot.asm -f bin -o boot.bin && qemu-system-i386 boot.bin
私はこの時点で動けなくなります。私のブートローダーはdisk read error
と表示されます。この時点で無視すると、kernel.cを実行している間に問題が発生します。間違ったメモリマッピングが使用されているようです。
を "まとめ"! –
プログラムの開始時に_DS_(データセグメント)が正しく設定されていないという問題があります。 SPも設定しますが、実際には有効な_SS_(スタックセグメント)を設定していません。これも問題を引き起こす可能性があります。 disk_loadでは、_ES_(拡張セグメント)を設定しません。これは、データが読み取られるメモリ位置が完全に指定されるように(ES:BXはアドレスバッファです)正しく設定する必要があります。 15セクタを読み取っている720kフロッピーディスクを作成している場合、トラック(シリンダ)の最大セクタが9であるため、動作しない可能性があります。これは読み込みの問題を引き起こす可能性があります。 –
NASMがブートローダー用の16ビットコードをすべて生成することを知るために、[ビット16]を先頭に入れておくのも良い考えです。 –