実際のモードからプロテクトモードに切り替えてロードし、GDTディスクリプタをロードしてからステージ2のコードを呼び出す独自のブートローダを作成しようとしています。私は自分のプログラムをデバッグする良い方法を見つけ出すことができないので、物事をうまく動かすにはうまくいっていない。いくつかの奇妙な理由から、私のコードは、私のブートローダの第2セクタを0x1000
アドレスのメモリに読み込むことに失敗します。私はとal = 0x01
とを使って試してみましたが、これはGet Status of Last Drive Operation
インターハンドです。それは0x01
を返します。これは私をさらに混乱させるInvalid Command
を意味します。コンピュータが起動するとブートイメージからセクタをロードするとブートローダでエラーが発生する
mov ah, 0 ;reset drive
int 0x13
or ah, ah ;check for error
jnz err ;error handling function (prints ASCII A)
mov ax, 0
mov es, ax
mov bx, 0x1000 ;read sector into 0000:0x1000
mov ah, 0x02 ;read sector
mov al, 1 ;# of sectors to read = 1
mov ch, 0 ;Cylinder = 0
mov cl, 0x02 ;Sector to read = 2 (second as first sector is this code)
mov dh, 0 ;head = 0
;dl should equal the drive number as BIOS automatically detects it
int 0x13
or ah, ah
jnz err ;check for error again (this is where the error occurs)
、私はすべての私の割り込みが正しいドライブ上で実行されなければならないので、BIOSがdl
レジスタにドライブ文字を置くことを聞いています。私もdl
を0x00
に設定しようとしましたが、これはフロッピードライブA:
と同じですし、BOCHS(CPUエミュレータ)ではフロッピードライブA:
を私のブートイメージに設定しても起動しませんでした。 QEMUとBOCHSがコードを正しくエミュレートしない理由は何ですか?私はまだこれをUSBに書き込んで、生きているBIOSから起動させてみました。私は完全なコードhereを掲載しますので、必要に応じて見直すことができます。私は十分に明確でない場合は謝罪し、私はOS開発の初心者です。どうもありがとう!
編集: OS:Windows 7 x64(開発中のx32 OS) エミュレーション:BOCHSはNASMコンパイラによって作成されたboot.imgを実行しています。
私はあなたの質問に答えましたか? – Stewart
@Stewart私はブートローダを書き直してテストすることができます。あなたの新しいコードを組み込むとすぐに私は戻って受け入れます。心配しないでください :) – user99545