Сборка - сегменты памяти
Мы уже обсудили три раздела программы сборки. Эти разделы также представляют различные сегменты памяти.
Интересно, что если вы замените ключевое слово section на segment, вы получите тот же результат. Попробуйте следующий код -
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 segment - Он представлен .data раздел и .bss. Раздел .data используется для объявления области памяти, в которой хранятся элементы данных для программы. Этот раздел не может быть расширен после объявления элементов данных, и он остается статичным на протяжении всей программы.
Раздел .bss также является разделом статической памяти, который содержит буферы для данных, которые будут объявлены позже в программе. Эта буферная память заполнена нулями.
Code segment - Он представлен .textраздел. Это определяет область в памяти, в которой хранятся коды инструкций. Это тоже фиксированная область.
Stack - Этот сегмент содержит значения данных, передаваемые функциям и процедурам в программе.