Zespół - Segmenty pamięci
Omówiliśmy już trzy sekcje programu montażu. Te sekcje reprezentują również różne segmenty pamięci.
Co ciekawe, jeśli zamienisz słowo kluczowe sekcja na segment, uzyskasz ten sam wynik. Wypróbuj następujący kod -
segment .text ;code segment
global _start ;must be declared for linker
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
segment .data ;data segment
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Hello, world!
Segmenty pamięci
Model pamięci segmentowej dzieli pamięć systemową na grupy niezależnych segmentów, do których odwołują się wskaźniki znajdujące się w rejestrach segmentów. Każdy segment zawiera określony typ danych. Jeden segment jest używany do przechowywania kodów instrukcji, inny segment przechowuje elementy danych, a trzeci segment przechowuje stos programu.
W świetle powyższej dyskusji możemy określić różne segmenty pamięci jako -
Data segment - Jest reprezentowany przez .data sekcja i .bss. Sekcja .data służy do deklarowania obszaru pamięci, w którym przechowywane są elementy danych dla programu. Ta sekcja nie może zostać rozszerzona po zadeklarowaniu elementów danych i pozostaje statyczna w całym programie.
Sekcja .bss jest również sekcją pamięci statycznej, która zawiera bufory dla danych, które mają być zadeklarowane później w programie. Ta pamięć buforowa jest zapełniona zerami.
Code segment - Jest reprezentowany przez .textSekcja. To definiuje obszar w pamięci, który przechowuje kody instrukcji. Jest to również obszar stały.
Stack - Ten segment zawiera wartości danych przekazywane do funkcji i procedur w programie.