Sections e _start: A divisão do código-fonte Assembly - A diretiva global

Quando um executável vai rodar, ele precisa saber a partir de onde, no código, ele começa a rodar.

Em programação, começar do começo não é algo comum.

Tendo em vista esses dados sobre a informação da ordem das coisas em um código, vamos falar neste tutorial de Assembly sobre as seções (sections) de um arquivo-fonte em Assembly.


Deixando seu código organizado

Programas feitos na linguagem de baixo nível Assembly tem uma características em comum: eles são grandes.


Sim, programar em Assembly é escrever bastante, pois é uma linguagem totalmente crua, onde muito pouco 'existe' e muito, quase tudo, é necessário criar.

Para se fazer um simples programa de cálculos matemáticos simples (somar, subtrair etc) é necessário que fazer uma rotina, manualmente, para essa tarefa, usando somente as instruções nativas do processador.


Em linguagens de alto nível, como C e Java, isso já vem totalmente pronto.

Não é necessário criar nada, somente utilizar.


Então, mais que todas as outras linguagens, é necessário ter organização para programar em Assembly. Seu código deve ser legível, organizado e comentado.


Visando essa organização, existe um comando (ou simplesmente rótulo, ou marcador) chamado section, que serve para definirmos seções em nosso código.

Para declarar uma section fazemos:
section .nomeDaSecao






























Como dividir um código Assembly: .data, .bss e .text

De uma maneira geral, os programadores Assembly utilizam três sections para organizar seus códigos. Seguir esses passos é interessante, visto que fará com que seus programas sejam organizados da maneira padrão, da maneira que é universalmente usada.



Na .data section, como o nome sugere, é uma região do código que será usada para tratar as informações, os dados, as variáveis.

Nesse trecho (geralmente o inicial), declaramos e inicializamos as variáveis.


Fazemos algo parecido na .bss section, porém não inicializamos as informações.


Por fim, a .text section é o local onde irá ficar armazenado suas instruções, que irão trabalhar com os dados previamente declarados.

Essa é a única seção obrigatória, pois conterá a label (rótulo) _start, que é o local onde os executáveis são inicializados.


Se já estudou C, C++ ou Java, por exemplo, a _start seria o main().

Logo, o esqueleto dos códigos em Assembly é:

section .dat
  ;declaração e inicialização de dados
 
section .bss
  ;declaração sem inicialização das informações que serão usadas
 
section .text
  ;o programa começa a rodar aqui, a partir da _start


Se comunicando com o mundo externo: global

Como as memórias e processadores estão ficando cada vez mais modernos e maiores (em relação ao tamanho da memória), está possível, cada vez mais, usar linguagens de alto nível (principalmente o C), para tarefas que eram feitas exclusivamente em Assembly.


Uma prova disso é o sistema operacional Linux, onde sua gigantesca parte é feita em C, com algumas pitadas em Assembly.

Essa pitada de Assembly no Kernel é justamente na parte que é necessária uma maior eficiência da máquina, pois como sabemos, em termos de eficiência nenhuma outra linguagem bate nossa amada linguagem.


Por isso, é bem comum a interação entre Assembly e outras linguagens. Um exemplo disso são os games de alto desempenho, que possuem rotinas feitas em Assembly, que se comunica com o resto do programa.

Ainda em nosso curso de Assembly veremos como usar funções das bibliotecas da linguagem C.


Uma maneira de fazer essa interação é através da diretiva (explicaremos o que é isso em breve) global.

A diretiva global mostra que o label relacionado é global, ou seja, é passível de uso externamente.

Geralmente usamos para declarar o label principal, o _start.

Portanto, o nosso esqueleto de código será:


section .dat
  ;declaração e inicialização de dados
 
section .bss
  ;declaração sem inicialização das informações que serão usadas
 
section .text
global _start
 
_start:
  ;o programa começa a rodar aqui, a partir daqui



Nenhum comentário:

Veja também: