int 0x13 への新しいアプローチを試みています (システムの仕組みについて詳しく知るためだけに): スタックを使用して DAP を作成する..
DL にディスク番号が含まれ、AX に PT の起動可能なエントリのアドレスが含まれ、DS が正しいセグメントに更新され、スタックが正しく設定されていると仮定すると、次のコードになります。
DWORD 0x00000000 をプッシュ 斧を追加、0x0008 ムーブシ、アックス プッシュ DWORD [ds:(si)] DWORD 0x00007c00 をプッシュ WORD 0x0001 をプッシュ WORD 0x0010 をプッシュ SSを押す ポップDS mov si, sp mov sp, bp ムーブああ、0x42 整数 0x13
ご覧のとおり、dap 構造をスタックにプッシュし、それを指すように DS:SI を更新します。DL は既に設定されており、次に AX を 0x42 に設定し、int 0x13 を呼び出します。
その結果、AH でエラー 0x01 が発生し、明らかに CF が設定されます。セクターは転送されません。スタックトレースを際限なくチェックしましたが、問題ありません。パーティションテーブルも問題ありません..何が欠けているのかわかりません...
これは、ディスク アドレス パケットのスタック トレース部分です。
0x000079ea: 10 00 adc %al,(%bx,%si) 0x000079ec: 01 00 add %ax,(%bx,%si) 0x000079ee: 00 7c 00 追加 %bh,0x0(%si) 0x000079f1: 00 00 add %al,(%bx,%si) 0x000079f3: 08 00 または %al,(%bx,%si) 0x000079f5: 00 00 add %al,(%bx,%si) 0x000079f7: 00 00 add %al,(%bx,%si) 0x000079f9: 00 a0 07 を追加 %ah,-0x41f9(%bx,%si)
私はqemuの最新バージョンを使用しており、ハードドライブ(0x80)から読み取ろうとしていますが、同じ結果(CF 1 AH 0x01)で構造体の4バイトアライメントも試しました。拡張機能が存在します。