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


3 comentários:

Ilson disse...

parabéns pela iniciativa
um blog para oferecer o fantástico assembly gratuitamente merece todos os elogios do mundo,porém uma sujestão,acredito que não só eu mais muitos outros estão se perdendo entre as seções,de introdução,instalação de assembler,básico etc... que tal uma numeração passo-a -passo des do início,para que o tutorial online fique numa ordem lógica?estou meio perdido,entre os "agora que você já viu tal passo" que eu nem ví e tenho que procurar e acabo perdido!
...numa ordem numérica ficaria tudo bem melhor..

parabéns mais uma vez!!

Apostila Assembly Progressivo disse...

Olá Ilson, tudo bem?

Primeiro, clica em "Introdução", lá tem os tutoriais na ordem.

A sequência deles é o "Básico".

Todos no menu superior.
Início de Agosto/2013, iremos voltar com os tutoriais de nosso curso de Assembly.

Qualquer dúvida, não deixe de perguntar.

Nicollas Miyashiro disse...

Gostaria de saber se pretendem ainda continuar com esse projeto, li boa parte de JavaProgressivo e em C li tudo. Mas agora pretendo aprender assembly com vocês, ou entao vou terminar de aprender ingles para poder ler o livro que recomendam. Abraços, muito obrigado por estarem publicando coisas muito úteis e de graça.