Montagem - Segmentos de Memória
Já discutimos as três seções de um programa de montagem. Essas seções também representam vários segmentos de memória.
Curiosamente, se você substituir a palavra-chave da seção por segmento, obterá o mesmo resultado. Experimente o seguinte código -
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 o código acima é compilado e executado, ele produz o seguinte resultado -
Hello, world!
Segmentos de Memória
Um modelo de memória segmentada divide a memória do sistema em grupos de segmentos independentes referenciados por ponteiros localizados nos registradores de segmento. Cada segmento é usado para conter um tipo específico de dados. Um segmento é usado para conter códigos de instrução, outro segmento armazena os elementos de dados e um terceiro segmento mantém a pilha do programa.
À luz da discussão acima, podemos especificar vários segmentos de memória como -
Data segment - É representado por .data seção e o .bss. A seção .data é usada para declarar a região da memória, onde os elementos de dados são armazenados para o programa. Esta seção não pode ser expandida depois que os elementos de dados são declarados e permanece estática em todo o programa.
A seção .bss também é uma seção de memória estática que contém buffers para os dados a serem declarados posteriormente no programa. Esta memória buffer é preenchida com zeros.
Code segment - É representado por .textseção. Isso define uma área na memória que armazena os códigos de instrução. Esta também é uma área fixa.
Stack - Este segmento contém valores de dados passados para funções e procedimentos dentro do programa.