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

Я следую сериям операционных разработок 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

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


person narayanpatra    schedule 09.11.2010    source источник


Ответы (2)


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

«Организация» сообщает ассемблеру, что именно оттуда будет запускаться код, после того, как он будет скопирован.

person Will Dean    schedule 09.11.2010
comment
Для уточнения: он копируется из сектора 0 дискеты по адресу памяти 0x7C00. - person ruslik; 09.11.2010

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

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

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