quarta-feira, 29 de junho de 2016

Estrutura básica de um programa assembly NASM (ubuntu)


Neste tópico irei abordar alguns conceitos básicos da linguagem Assembly utilizada pelo compilador NASM. Expliquei como compilar programas assembly no ubuntu neste post.

Vantagens da linguagem Assembly

  1. Interfaceia os programas diretamente com o hardware, sistema operacional e BIOS.
  2. O fato da linguagem ser de baixo nível, permite que programa rode geralmente mais rápido e consumindo menos memória.
  3. Devido sua facilidade em acessar hardware, é uma boa alternativa na hora de construir drivers e afins.

Desvantagens da linguagem Assembly

  1. Em muitos casos é pouco produtiva em termos de tempo.
  2. Pode exigir bem mais conhecimentos do que uma linguagem de nivel alto.
  3. Em muitas situações, especialmente em processadores de arquitetura RISC (acrônimo de Reduced Instruction Set Computer; em português, "Computador com um conjunto reduzido de instruções") você terá de construir as rotinas manualmente.

Endereçando dados na memória em assembly

O processo de execução ou ciclo de execução se divide em três partes principais: buscar , decodificar e executar as instruções.

Em determinados grupos de dados o processador terá que "quebrar" a informação que está no registrador para armazenar na memória. 

Por exemplo, um valor 1012h poderá ser dividido em dois grupos de 1 byte, o primeiro armazenando 10h e o segundo com 12h. 

Os dados são armazenados na memória de forma reversa, ou seja, na posição da memória "x" será armazenado o valor 12h já na posição x+1, o valor 10h. Quando retirado da memória para os registradores, ocorre novamente uma troca pelo qual ele volta a ficar na posição original.

Existem dois tipos de enderaçamento de memoria: endereçamento por valor"absoluto" e por "segmentação". No endereçamento direto ou absoluto, faz-se referenciamento ao endereço diretamente; já no endereçamento por segmentação é usado um sistema de offset, no qual é usado um endereço inicial mais um valor chamado "offset".

Sintaxe básica de um programa assembly

Um programa em assembly é comumente dividido em trẽs seções:
  • section .data -  seção utilizada para guardar constantes e dados inicializados (aqueles que já são declarados junto com a sua inicialização).
  • section .bss -  seção que guarda as variáveis de seu programa.
  • section .text - este é o local que irá armazenar as instruções , ou seja, o código. Esta seção deve conter o ponto de entrada do sistema que é representada pela declaração global main.
Exemplo:
section .text        ;seção onde o código é escrito
    global main   
main:                  ;ponto de entrada do linker
    mov edx,len   
    mov ecx,msg  
    mov ebx,1      
    mov eax,4      
    int 0x80         
 
    mov eax,1      
    int 0x80

section .data       ;dados inicializados e constantes
msg db 'Ola mundo!', 0xa   ;string

len equ $ - msg                    ;tamanho da string
section .bss

Comentários

São representados pelo ";" seguidos do comentário.
Exemplo:

add ah,bh ;isto é um comentário 

Declarações da linguagem Assembly

São basicamente três tipos de delclarações: instruções, diretivas e macros.

  • Instruções são códigos voltados à máquina, o que gera a execução de uma ação e dizem efetivamente o que o processador deve fazer. Essas instruções geram um código de máquina.
  • Diretivas são voltadas ao compilador e não a máquina. Dizem ao compilador (assembler) como será o processo de assemblagem (compilação).
  • Macros funcionam como simples substituição de texto. 
A partir de agora iremos fazer nossos primeiros programas nessa maravilhosa linguagem. Para isso recomendo instalar o SASM, que é uma IDE que utilizo para construir meus programas e é bem compativel com o NASM.


Neste post aprendemos a montar o esqueleto básico em assembly. No próximo, começarei a explicar os tópicos principais desta linguagem.

Nenhum comentário:

Postar um comentário

Gradiente descendente em python para problemas em 1° grau

O seguinte código utiliza o recurso gradiente descendente para descobrir dois parâmetros, theta e theta1, que irão descrever uma equação d...