2

次のコードでディスクセクターを読み取ろうとしています:

disk_load :
push dx 

mov ah , 0x02 ; BIOS read sector function
mov al , dh ; Read DH sectors(dh is initialized before calling the routine)
mov ch , 0x01 ;
mov dh , 0x00 ; Select head 0
mov cl , 0x02 ; Start reading from second sector ( i.e.
; after the boot sector )

mov dl,0x80 (tried with 0x00 as well)

int 0x13 ; BIOS interrupt

pop dx ; Restore DX from the stack
jc cset

cmp dh,al ; if AL ( sectors read ) != DH ( sectors expected )
jne disk_error ; 

問題は、エラーを示すたびにキャリーフラグが設定されることです。最初にブートディスク 0x00 を試してみましたが、後で AL レジスタを確認したところ、セクターが読み取られていないことがわかりました。次に、0x80 に変更しました。これで、AL レジスタには要求された正確な数のセクタが含まれますが、キャリー フラグは設定されたままです!

では、ここで何が問題になるのでしょうか? キャリーは必ず int 0x13 の後に設定されているようです! 問題があれば、Virtual Box で iso ファイルを実行しています。

4

1 に答える 1

4

いくつかのヒント:

  1. CHシリンダーにはゼロから番号が付けられているため、1 つではなく 0をロードする必要があります。
  2. 失敗すると にエラー コードが返されAHますが、それを確認しましたか?
  3. CD からの起動 (おっしゃるとおり) は複雑です。特に、フロッピー エミュレーションが有効になっているかどうかを確認してください。または、問題が解決するまで仮想フロッピーを使用してください。
  4. BIOS は通常、起動ドライブを渡すDLので、上書きする必要はありません。

フロッピー イメージと修正点 #1 を使用すると、bochs と qemu で動作します (virtualbox はありません)。

于 2013-10-15T17:13:18.917 に答える