3

私はブートローダーの作成に取り組んでおり、私がフォローしているチュートリアルはこのコードを提供します:

main:

 ;----------------------------------------------------
 ; code located at 0000:7C00, adjust segment registers
 ;----------------------------------------------------

      cli                       ; disable interrupts
      mov     ax, 0x07C0                ; setup registers to point to our segment
      mov     ds, ax
      mov     es, ax
      mov     fs, ax
      mov     gs, ax

 ;----------------------------------------------------
 ; create stack
 ;----------------------------------------------------

      mov     ax, 0x0000                ; set the stack
      mov     ss, ax
      mov     sp, 0xFFFF
      sti                       ; restore interrupts

何か誤解しているかもしれませんが、SS レジスタに 0x0000 が含まれているということは、ds、es、fs、および gs がスタックにオーバーラップするということではないでしょうか? また、fs および gs レジスタの機能は何ですか? また、cs セグメントは BIOS によって自動的に設定されますか? コードが 0000:7c00 にあると言われているためです。また、チュートリアルでは、割り込みが無効になっている理由については説明していません。デッドロックを回避するために通常は割り込みが無効になっていることをどこかで読みました。これは何を意味し、なぜそれが起こるのですか?

4

1 に答える 1

8

少なくとも理論的には、はい、スタックとコードが重複する可能性があります。そうしない理由は非常に単純です。ブートローダは非常に小さく、通常は多くのスタック スペースを使用しないため、ブートローダ コードの末尾を上書きするほどスタックが下方向に成長することはありません。

fs と gs に関する限り、専用の用途はありません。問題のブートローダーのコードを見なければ、それらがまったく使用されているかどうか疑問が生じます。それらが使用される場合、それらが何に使用されるかについてさらに疑問が生じます。

ディスク BIOS は、ディスクからセクターを 07c00:0000h にロードし、そこにファージャンプします。ファージャンプセットcs.

割り込みを実行するとデータがスタックにプッシュされる (試行される) ため、スタックのセットアップ中に割り込みを無効にします。スタック (SS と SP の両方) をまだ設定していない場合、通常、データ (フラグと戻りアドレス) がメモリ内のどこにあるのか、または上書きされる可能性のある他のデータはわかりません。これは一般的に望ましくないため、少なくとも SS と SP の両方がセットアップされるまで割り込みを無効にします。

于 2012-05-07T18:22:02.873 に答える