2012-03-26 6 views
1

実際のモードからプロテクトモードに切り替えてロードし、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レジスタにドライブ文字を置くことを聞いています。私もdl0x00に設定しようとしましたが、これはフロッピードライブA:と同じですし、BOCHS(CPUエミュレータ)ではフロッピードライブA:を私のブートイメージに設定しても起動しませんでした。 QEMUとBOCHSがコードを正しくエミュレートしない理由は何ですか?私はまだこれをUSBに書き込んで、生きているBIOSから起動させてみました。私は完全なコードhereを掲載しますので、必要に応じて見直すことができます。私は十分に明確でない場合は謝罪し、私はOS開発の初心者です。どうもありがとう!

編集: OS:Windows 7 x64(開発中のx32 OS) エミュレーション:BOCHSはNASMコンパイラによって作成されたboot.imgを実行しています。

+0

私はあなたの質問に答えましたか? – Stewart

+0

@Stewart私はブートローダを書き直してテストすることができます。あなたの新しいコードを組み込むとすぐに私は戻って受け入れます。心配しないでください :) – user99545

答えて

0

エラーを誤って確認しています。 int 0x13 ah = 0は、たとえば、あとで何かを報告するのではなく、キャリーフラグを設定することによってエラーを示します。 ah jnz errの代わりに、またはああ、jc errを使ってキャリーが設定されていると、ジャンプしているはずです。

関連する問題