9

このコードがわかりません:

mov ax, 07C0h   ; Set up 4K of stack space above buffer
add ax, 544     ; 8k buffer = 512 paragraphs + 32 paragraphs (loader)
cli             ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti             ; Restore interrupts
  • mov ax, 07C0h - ここで BIOS がコードをロードします。しかし、「4K」とは何ですか?キロバイト?私はそれを取得しませんでした:)
  • add axe, 544 - なぜまた「8K」なのですか? そして、なぜ544を追加するのですか? なぜ512ではないのですか?
  • mov sp, 4096 - ここでスタック ポインタを設定します。

スタック ポインターを設定する前に、これらすべての操作を行うのはなぜでしょうか。

4

1 に答える 1

9

最後の行のコメントはそれを要約していると思います:

buffer:             ; Disk buffer begins (8k after this, stack starts)

メモリ レイアウトは次のようになります。

+-------------------+ <-- 07C0:0000, where the BIOS loads the boot sector
| 512 bytes of code |
+-------------------+
| 8KB set aside for |
|   a disk buffer   |
+-------------------+ <-- SS:0000
|   4KB of stack    |
+-------------------+ <-- SS:1000 = SS:SP

段落についてのコメントはやや鈍いです。16 バイトで 1 つの段落を構成するバイト単位で考えた方が簡単だと思います。

これらの魔法の数字の理由:

  • BIOS がコードをロードするセグメント 07C0 から開始します。
  • コード自体を考慮して、512 バイトをスキップします (512 バイト = 32 段落)。
  • 8KB をスキップして、ディスク バッファー用のスペースを確保します (8,192 バイト = 512 段落)。
  • 4KB ブロックの先頭に SS を置きます。512+8192 = 8,704 バイト = 544 段落
  • そのブロックの最後に SP を置きます。スタックはメモリ内で上向きに成長する必要があるため、最後に配置します。

SP レジスタにはバイト単位の値が必要なため、数値 4096 = 4KB がコードに通常どおり表示されることに注意してください。他のすべての値は、セグメント レジスタである SS に関連するため、段落になっています。

于 2010-07-12T20:10:06.397 に答える