A linguagem de montagem é bem parecida com os códigos do computador, utilizando também a codificação binária. Porém, ela depende do tipo de processador, não existindo, portanto, linguagem de montagem única. Assim, é preciso conhecer um mínimo do funcionamento de um processador para poder entender esse conceito. Como um processeador real possui diversos registros e instruções, aqui veremos apenas o que diz respeito a um processador simples.
O processador está conectado à memória através de uma conexão chamada bus (ou barramento). Os dados de que o processador precisa ficam armazenados no que chamamos de registros. Cada um deles possui sua própria utilidade, conforme pode ser visto na tabela abaixo:
Nome do registro | Tamanho |
---|---|
Acumulador AX | 16 bits |
Registro auxiliar básico BX | 16 bits |
Registro auxiliar (contador) CX | 16 bits |
Registro auxiliar de dados DX | 16 bits |
Ponteiro de instrução IP | 16 bits |
?ndice de fonte SI | 16 bits |
?ndice de destino DI | 16 bits |
Código de registro de segmentos CS | 16 bits |
Registro do segmento de dados DS | 16 bits |
Registro do segmento da pilha SS | 16 bits |
Registro do segmento adicional ES | 16 bits |
Ponteiro de pilha SP | 16 bits |
Ponteiro básico BP | 16 bits |
Os registros AX, BX, CX e DX são os mais usados para os cálculos:
Trata-se da utilização básica desses registros, mas, na prática, eles podem ser usados para outros fins.
Esses registros podem ser usados por blocos de um byte (8 bits). A letra X de seus nomes é substituída pelo L (de low - baixo, em inglês - para indicar os bits mais leves) e H (de high - alto, em inglês - para indicar os bits mais pesados). Além disso, nas arquiteturas x86, esses registros se estendem a 32 bits e seu nome é precedido por um E (de extended - estendido, em inglês).
EAX (32 bits) | |||
AX (16 bits) | |||
AH (8 bits) | AL (8 bits) |
Para fazer o processador executar uma série de instruções, é preciso fornecer dados binários (muitas vezes representados em notação hexadecimal para facilitar a leitura). As funções em notação hexadecimal são difíceis de decorar e é por isso que a linguagem de montagem foi desenvolvida. Com ela, é possível anotar as instruções com nomes explícitos seguidos de parâmetros.
Veja o exemplo de um programa em código:
A1 01 10 03 06 01 12 A3 01 14
Trata-se da representação hexadecimal de um programa que soma os valores de duas casas da memória e armazena o resultado em uma terceira casa. É óbvio que este tipo de escrita é dificilmente legível por nós, humanos.
Assim, já que todas as instruções que o processador pode executar são associadas a um valor binário, utilizamos uma notação simbólica em forma de texto correspondente a cada função. Ou seja, o que chamamos de linguagem de montagem. No exemplo anterior, a sequência A1 01 10 significa copiar o conteúdo da memória no endereço 0110h no registo AX do processador. Isto se nota em linguagem de montagem:
MOV AX, [0110]
Todas as instruções têm uma notação simbólica associada (fornecida pelo fabricante do processador). O uso de linguagem de montagem consiste, portanto, em escrever, de forma simbólica, a sucessão de instruções precedidas por seus endereços a fim de identificar as instruções e passar facilmente de uma para outra. Essas instruções são armazenadas em um arquivo de texto (o arquivo fonte) que, graças a um programa específico (chamado de linguagem de montagem) será traduzido para o código de máquina.
O programa anterior escrito em linguagem de montagem daria isso:
Endereço da instrução | Instrução em código de máquina | Instrução em linguagem de montagem | Comentários sobre a instrução |
---|---|---|---|
0100 | A1 01 10 | MOV AX, [0110] | Copiar o conteúdo de 0110 no registro AX |
0103 | 03 06 01 12 | ADD AX, [0112] | Adicionar o conteúdo de 0112 à AX e por o resultado no AX |
0107 | A3 01 14 | MOV [0114], AX | Armazenar AX no endereço da memória 0114 |
A escrita em linguagem de montagem, embora ainda difícil, é muito mais fácil de ser compreendida por um ser humano, porque, de modo geral, os nomes são mais fáceis de decorar do que números.