2010-11-09 79 views
0

我跟隨brokenthorn operating development series來學習引導程序。在this page,是三個行的代碼:關於引導程序的問題

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 

在第二行他軟盤加載BIOS的7c00。爲什麼不在0000?我檢查了Where to store the bootloader on a floppy image?。 這裏也給出了同樣的事情。但原因沒有解釋。有人可以向我解釋這個嗎?提前致謝。

編輯:我感到困惑,因爲在同一個站點在以後的教程中的代碼是:

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 

現在,這裏爲什麼他用組織0?那麼他爲什麼將地址複製到所有寄存器? 對不起,這是一個愚蠢的問題。我對彙編編程非常陌生,剛開始閱讀有關引導加載程序。

回答

0

Here它說:

BIOS開發團隊決定0x7C00 因爲:

  1. 他們想留下儘可能多的房間儘可能爲OS的32KiB內加載 本身。
  2. 8086/8088使用0x0 - 0x3FF作爲中斷向量,並且BIOS數據區域 在之後。
  3. 引導扇區爲512字節,引導程序 的堆棧/數據區域需要更多512字節。
  4. 因此,0x7C00,32KiB的最後一個1024B被選中。
+0

順便說一句,從你的措辭來看,你不清楚你是否理解:BIOS將bootloader *複製到內存中的0x7C00地址。 – AndreKR 2010-11-09 15:46:17

+0

已編輯的問題。好心檢查。 – narayanpatra 2010-11-09 16:33:47

1

我想你可能會混淆兩個不同的東西。引導加載程序位於軟盤的開頭(我猜是從哪裏得到0000),但BIOS在將其複製到地址7c00的內存中之後才運行它。

'org'告訴彙編程序,代碼將從開始運行,已被複制。

+0

澄清:它從軟盤的扇區0複製到內存地址0x7C00。 – ruslik 2010-11-09 16:04:11

+0

已編輯的問題。好心檢查。 – narayanpatra 2010-11-09 16:30:50