Etykiety (labels) w NASM

0

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?

1

AFAIK x86-owy jmp jest relatywny (ogólnie temat nazywa się position-independent code), więc procesor nie skacze do instrukcji pod adresem %x, a raczej o %d bajtów w przód / w tył.

0

Ale przecież jak kompilujesz to kompilator wie gdzie jest ta etykieta i zamienia to sobie na adres? Jak wrzucisz sobie to po kompilacji do deasemblera to będzie tam jmp pod konkretny adres.
Problem to by był jakby to miało być PIE i wtedy kompilator zamieniłby ten jump na relatywny adres względem aktualnego IP

2

Chciałbym zwrócić uwagę, że domyślnym trybem kompilacji dla Nasm są skoki BEZPŚREDNIE, dopiero dyrektywa:

; adresowanie względne
[default rel]

zmienia adresowanie wszystkich skoków na RELATYWNE.

1 użytkowników online, w tym zalogowanych: 0, gości: 1