Assemblaggio - Segmenti di memoria

Abbiamo già discusso le tre sezioni di un programma di assemblea. Queste sezioni rappresentano anche vari segmenti di memoria.

È interessante notare che se sostituisci la parola chiave della sezione con segmento, otterrai lo stesso risultato. Prova il codice seguente:

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

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Hello, world!

Segmenti di memoria

Un modello di memoria segmentata divide la memoria di sistema in gruppi di segmenti indipendenti referenziati da puntatori situati nei registri di segmento. Ogni segmento viene utilizzato per contenere un tipo specifico di dati. Un segmento viene utilizzato per contenere i codici di istruzione, un altro segmento memorizza gli elementi di dati e un terzo segmento conserva lo stack del programma.

Alla luce della discussione precedente, possiamo specificare vari segmenti di memoria come:

  • Data segment - È rappresentato da .data sezione e il .bss. La sezione .data viene utilizzata per dichiarare la regione di memoria, in cui sono memorizzati gli elementi di dati per il programma. Questa sezione non può essere espansa dopo che gli elementi di dati sono stati dichiarati e rimane statica in tutto il programma.

    La sezione .bss è anche una sezione di memoria statica che contiene buffer per i dati da dichiarare successivamente nel programma. Questa memoria buffer è riempita con zero.

  • Code segment - È rappresentato da .textsezione. Definisce un'area della memoria che memorizza i codici delle istruzioni. Anche questa è un'area fissa.

  • Stack - Questo segmento contiene i valori dei dati passati a funzioni e procedure all'interno del programma.