Patrzę sobie aktualnie na kod CyjonOS'a, czyli projektu naszego forumowicza o nicku @Akasei. Pozwolę sobie wkleić tutaj fragment bootloadera i jego część, która jest odpowiedzialna za przełączenie procesora w tryb 32-bitowy.
zero_protected_mode:
...
; skocz do 32 bitowego kodu
jmp long 0x0008:zero_protected_mode_entry
...
[bits 32]
zero_protected_mode_entry:
; ustaw deskryptory danych, ekstra i stosu na przestrzeń danych
mov ax, 0x10
Ten kod jest załadowany do pamięci fizycznej pod adres liniowy 0x1000
(Chyba. Na pewno załadowany jest pod adres 0x1000 + coś tam konkretniej). Etykiety (labels) w NASM służą jedynie pomocy w celu łatwiejszej nawigacji po kodzie źródłowym, a tak naprawdę są offsetami
od początku pliku do oznaczonego miejsca w kodzie. Skoro ten kod zaczyna się na adresie fizycznym 0x1000
to skąd procesor wie, że poprzez instrukcję jmp long 0x0008:zero_protected_mode_entry
on ma skoczyć dokładnie w miejsce instrukcji mov ax, 0x10
?
Przecież ta etykieta zero_protected_mode_entry:
jest równa temu 0x0+zero_protected_mode_entry:
, bo nie zostało wskazane NASM'owi poprzez instrukcję [org 0x1000]
, że ma traktować WSZYSTKIE etykiety jakby były offsetami zaczynając od adresu 0x1000
. Skoro tak to skąd procesor wie, że ma skoczyć pod adres 0x1000+zero_protected_mode_entry
, a nie pod adres 0x0+zero_protected_mode_entry
?