3

私のコードはvirtualboxで完全に機能しますが、実際のP​​Cで起動した場合は機能しません(BIOSがUSBハードドライブとして検出するUSB​​ペンドライブから)。

virtualboxで; コードはディスクのセクター2と3をメモリに読み取り、最初の128バイトを(デバッグステップとして)出力してから、それらのセクターに格納されているコードを実行します。

私の実際のPCでは、正しいバイトを画面に正常に出力します(したがって、明らかにディスクを正しく読み取り、メモリ内の期待される場所に書き込みます)が、ジャンプするのではなく、その時点で実行を停止します。

なぜそれが違うのでしょうか、そして私は何を間違っているのでしょうか?

ORG 0x7C00;

; Load Sector 2&3 from disk to 0x1000

mov bx , 0x1000             
mov ah , 0x02   
mov al , 0x02   
mov ch , 0x00   
mov dh , 0x00   
mov cl , 0x02   
int 0x13;


;Print 0x1000 + 128 bytes

mov ah, 0x0e        
mov bx ,0x1000;
loop2:          

mov al, [bx]        
cmp bx, 0x1000+128  

je end2
int 0x10        
add bx , 1;     
jmp loop2;

end2:

; Run our code


call 0x1000

jmp $;

TIMES 510 - ($ - $$) DB 0
DW 0xAA55
4

1 に答える 1

7

このコードには、実際のハードウェアで見つかる可能性のある多くの問題があります。

  1. ブートローダーに入ったときのほとんどのレジスタの状態は未定義ですが、割り込みルーチンを呼び出すときはレジスタが有効である必要があります。ブートセクタを起動したらすぐにセグメントレジスタを設定してください。たとえば、ES!= CSの場合、第2ステージへのジャンプは間違った場所に到達します。

  2. 割り込みルーチンを呼び出す前に、有効なスタックがあることを確認してください。

  3. 使用可能な割り込みルーチンに依存しないでください。多くのハードウェアベンダーは、WindowsとLinuxで動作するようにハードウェアを構築することを認識しており(顧客の99.999%が望んでいるため)、WindowsとLinuxが呼び出さないことを知っている割り込みルーチンをわざわざ実装しません。

  4. ディスクアクセスを行う前に、ビデオディスプレイに文字列を印刷するなど、もっと簡単なことを試してください。次に、レジスタを画面に印刷する方法を記述します。そうして初めて、デバッグ可能な方法でブートローダーの作成を開始できるようになります。

于 2013-03-25T16:35:59.967 に答える