Учебники

Сборка — Сегменты памяти

Мы уже обсудили три раздела программы сборки. Эти разделы также представляют различные сегменты памяти.

Интересно, что если вы замените ключевое слово раздела на сегмент, вы получите тот же результат. Попробуйте следующий код —

Live Demo

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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Hello, world!

Сегменты памяти

Модель сегментированной памяти делит системную память на группы независимых сегментов, на которые ссылаются указатели, расположенные в регистрах сегментов. Каждый сегмент используется для хранения данных определенного типа. Один сегмент используется для хранения кодов команд, другой — для хранения элементов данных, а третий — для программного стека.

В свете вышеизложенного мы можем указать различные сегменты памяти как —

Сегмент данных. Он представлен разделом .data и .bss . Раздел .data используется для объявления области памяти, где хранятся элементы данных для программы. Этот раздел не может быть расширен после объявления элементов данных, и он остается статическим во всей программе.

Раздел .bss также является разделом статической памяти, который содержит буферы для данных, которые будут объявлены позже в программе. Эта буферная память заполнена нулями.

Сегмент кода. Он представлен разделом .text . Это определяет область в памяти, в которой хранятся коды команд. Это также фиксированная зона.

Стек — этот сегмент содержит значения данных, передаваемые функциям и процедурам в программе.