Motorola MC6800.

Assembly ou linguagem de montagem é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa, utilizada para programar códigos entendidos por dispositivos computacionais, como microprocessadores e microcontroladores. O código de máquina torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemónicos[1][2].

Por exemplo, enquanto um computador sabe o que a instrução-máquina IA-32 (B0 61) faz, para os programadores é mais fácil recordar a representação equivalente em instruções mnemónicas MOV AL, 61h. Tal instrução ordena que o valor hexadecimal 61 (97, em decimal) seja movido para o registrador 'AL'. Embora muitas pessoas pensem no código de máquina como valores em binário, ele é normalmente representado por valores em hexadecimal.

A tradução do código Assembly para o código de máquina é feita pelo montador ou assembler. Ele converte os mnemónicos em seus respectivos opcodes, calcula os endereços de referências de memória e faz algumas outras operações para gerar o código de máquina que será executado pelo computador.

Arquitetura

Ao contrário do que acontece nas linguagens de alto nível, existe uma correspondência de 1 para 1 entre o código programado e o resultante. Isto é, uma instrução do programa equivale a uma operação do computador.[3]

Cada arquitetura de computador tem seu próprio código de máquina, e cada montador gera códigos para uma arquitetura específica. Cada um desses montadores tem sua própria versão de código Assembly, que pode diferir ao uso de registradores, representação de números, ou até mesmo instruções mnemónicas. E isso pode dificultar um pouco na portabilidade do código, tendo em vista que o mesmo precisaria ser reescrito para poder ser montado para outra arquitetura.

Registradores

Os registradores são pequenas e rápidas áreas de memória utilizada para diversos fins. Alguns desses registradores são utilizados para designar os locais da memória em que o processador vai executar ou pegar informações.

Registradores de segmento

Segmento é uma área da memória usada para armazenar instruções, dados ou usado pela pilha[4]. Os seguintes registradores são usados para designar estas áreas:

Registradores ponteiros

Esses registradores são utilizados para indicar posições da memória de instruções e dados.

Registradores de dados

Usado de forma geral no programa, para várias operações. Embora possam ser utilizados em outras ocasiões, cada um desses registradores foram feitos para tarefas específicas.

Esses registradores na verdade são uma junção de dois registradores de 8bits, somando ao todo 16bits. Eles são AH, AL, BH, BL, CH, CL, DH, DL.

Também existem versões de 32 e 64bits desses registradores. Onde eles são:

Montador

O montador ou assembler (não confundir com assembly) é um programa que cria o código objeto traduzindo as instruções da linguagem de montagem (assembly) para código de máquina. Além dos comandos básicos, que são traduzidos diretamente para a linguagem de máquina, alguns montadores também aceitam diretivas, que são comandos específicos para o montador. Por exemplo, é possível definir constantes na memória utilizando diretivas.[5]

O montador possui tabelas, onde armazena informações importantes sobre o programa que está sendo montado. Tabelas de rótulos, de constantes e de comandos são as mais comuns.[5]

Exemplo de código Assembly

Este mesmo código sendo executado no QEMU

Um exemplo de código Olá Mundo feito para arquitetura 8086 que pode ser executado em uma máquina real sem APIs na sintaxe do NASM:

[BITS 16]          ; Faz o assembler gerar código 16-bits
[ORG 0x7C00]       ; A BIOS carrega nosso programa no endereço 0x7C00

mov si, Hello      ; Carregar a string de Hello World
call Print         ; Chamar nossa rotina para escrever a string

jmp $              ; Parar o programa em um loop infinito

; Rotina para escrever strings
Print:
	lodsb        ; Carregar um caractere da string em AL
	cmp al, 0    ; Ver se estamos no final da string (caractere 0x00)
	je .END      ; Se sim, pular para o final da rotina
	mov ah, 0Eh  ; Configurar AH para chamar a rotina 0Eh da BIOS
	int 10h      ; Executar a interrupção de vídeo
	jmp Print    ; Escrever o próximo caractere
.END:     ; Final da rotina
ret       ; Retornar

; String Hello
Hello: db "Ola mundo!", 0x00

;=========================================
; Preencher o resto do arquivo com zeros
times 510-($-$$) db 0
; Assinatura da BIOS
dw 0xAA55

Ver também

Referências

  1. Assembly - Knol
  2. Linguagem de montagem - UFF
  3. Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação
  4. [PDF Memória Segmentos.
  5. a b Ricardo Anido (25 de Fevereiro de 2011). «Introdução à Organização de Computadores e Linguagens de Montagem» (PDF). Universidade Estadual de Campinas. Consultado em 11 de março de 2012 

Ligações externas