0

私は、ブートローダーについて研究するために、壊れたとげのあるオペレーティング開発シリーズをフォローしています。このページでは、次の3行のコードがあります。

bits    16  ; We are still in 16 bit Real Mode
org     0x7c00  ; We are loaded by BIOS at 0x7C00
start:      jmp loader ; jump over OEM block

2行目では、彼はフロッピーで7c00にBIOSをロードしました。なぜ0000にしないのですか?フロッピーイメージのブートローダーをどこに保存するかを確認しました。。ここでも同じことが言えます。しかし、その理由は説明されていません。誰かが私にこれを説明できますか?前もって感謝します。

編集:後のチュートリアルの同じサイトでコードが次のようになっているため、混乱しています:

bits    16  ; we are in 16 bit real mode

org  0   ; we will set regisers later

start:  jmp main ; jump to start of bootloader

そしてメインで

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

ここで、なぜ彼はorg 0を使用したのですか?そして、なぜ彼はそのアドレスをすべてのレジスタにコピーしたのでしょうか。これがばかげた質問ならごめんなさい。私はアセンブリプログラミングに非常に慣れておらず、ブートローダーについて読み始めたばかりです。

4

2 に答える 2

1

2つの異なるものを混同している可能性があると思います。ブートローダはフロッピーの先頭 (どこから 0000 を取得したかだと思います) に存在しますが、BIOS はそれを実行する前にアドレス 7c00 のメモリにコピーします。

「org」は、コードがコピーされた後、そこからコードが実行されることをアセンブラーに伝えます。

于 2010-11-09T15:46:53.653 に答える
0

ここでは次のように述べています。

BIOS 開発者チームは、次の理由で 0x7C00 を決定しました。

  1. 彼らは、OS が 32KiB 内でロードできるように、できるだけ多くの余地を残したいと考えていました。
  2. 8086/8088 は割り込みベクトルに 0x0 ~ 0x3FF を使用し、BIOS データ領域はその後にありました。
  3. ブート セクタは 512 バイトで、ブート プログラム用のスタック/データ領域にはさらに 512 バイトが必要でした。
  4. したがって、32KiB の最後の 1024B である 0x7C00 が選択されました。
于 2010-11-09T15:45:00.567 に答える