Вопрос по загрузчику - PullRequest
       92

Вопрос по загрузчику

0 голосов
/ 09 ноября 2010

Я изучаю серию brokenthorn для разработки операционных систем , чтобы узнать о загрузчике. В этой странице это три строки кода:

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

Во второй строке он загрузил биос в 7c00 на дискете. почему не по 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

Теперь, почему он использовал орг 0? И зачем тогда он скопировал адрес во все регистры? Извините, если это глупый вопрос. Я очень плохо знаком с программированием на ассемблере и только начал читать о загрузчиках.

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Я думаю, вы можете смешивать две разные вещи. Загрузчик живет в начале дискеты (я думаю, откуда вы взяли 0000), но BIOS копирует его в память по адресу 7c00 перед запуском.

org сообщает ассемблеру, что именно из этого кода и будет выполняться код, после того, как скопирован.

0 голосов
/ 09 ноября 2010

Здесь написано:

Команда разработчиков BIOS решила 0x7C00 потому что:

  1. Они хотели оставить как можно больше места для загрузки ОС сам в пределах 32 КБ.
  2. 8086/8088 использовал 0x0 - 0x3FF для вектора прерываний и области данных BIOS был после него.
  3. Загрузочный сектор был 512 байт, а область стека / данных для загрузочной программы нужно больше 512 байт.
  4. Итак, 0x7C00, были выбраны последние 1024B из 32KiB.
...