Мы уже обсудили три раздела программы сборки. Эти разделы также представляют различные сегменты памяти.
Интересно, что если вы замените ключевое слово раздела на сегмент, вы получите тот же результат. Попробуйте следующий код —
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 . Это определяет область в памяти, в которой хранятся коды команд. Это также фиксированная зона.
Стек — этот сегмент содержит значения данных, передаваемые функциям и процедурам в программе.