O assembly surgiu em meados dos anos 50, dando início à segunda geração de linguagens de programação, quando os computadores ainda eram movidos a válvula. Nessa época, havia uma grande necessidade de poder de processamento, pois países como EUA e Rússia, viviam uma corrida espacial e estavam no auge do desenvolvimento de armamentos nucleares.
Com a invenção do transistor, os computadores ficaram mais compactos e rápidos, com isso, surgiu a necessidade de se criar um novo modelo de programação. Esse modelo deveria ter leitura e escrita mais simples que cartões perfurados, mas mantendo o nível de programação próximo da linguagem de máquina. E foi assim que surgiram as linguagens de baixo nível e, consequentemente, a primeira linguagem de baixo nível, o assembly. O programa seria escrito em assembly, traduzido em linguagem de máquina por um ”montador” assembler (por isso é frequentemente chamado de linguagem de montagem), que recorre a uma tabela de tradução.
Criar um código em assembly não é uma atividade fácil, um dos motivos é o fato de assembly não ser uma linguagem portável, onde existe completa dependência do hardware que varia para cada família de processadores (Ex: x86, ARM, MIPS)
- Exemplo (Sintaxe Intel):
mov eax,1 ; Interrupção Exit
mov ebx,0 ; Argumento em EBX
int 80h ; Chamada da interrupção
- Exemplo (Sintaxe AT&T):
movl $1,%eax
movl $0, %ebx
int $0x80
A linguagem assembly utiliza códigos mnemônicos (ADD, SUB, ...), mais fáceis de aprender e memorizar que os códigos numéricos cada instrução tem uma correspondência de um-para-um com as instruções em linguagem de máquina.
Para programar em assembly, o programador deveria conhecer o hardware da máquina, por exemplo, um processador Intel tem 8 registradores, são memórias muito rápidas que ficam dentro do processador, são eles:
• ESP e EBP – Registradores usados para trabalhar preferencialmente com pilhas, enquanto ESP guarda a referência do topo da pilha, EBP é usado para andar sobre ela.
• EAX (Acumulador) - Utilizado em operações aritméticas, acesso de portas de entrada e saída, transferência de dados, guardar resultados, entre outros.
• EBX (Base) – Utilizado como ponteiro de acesso à memória, índice, e auxiliar às operações aritméticas do registrador EAX.
• ECX (Contador) – Servir de contador para os laços de repetição.
• EDX (Dados) -Usado em operações aritméticas juntamente com EAX (EDX recebe o resto da divisão e o produto da multiplicação), acesso de portas de entrada e saída, entre outros.
• ESI e EDI – Geralmente são usados para movimentação de dados, com ESI guardando o endereço fonte de uma variável e EDI guardando o endereço do destino.
Os registradores EAX, EBX, ECX e EDX, são chamados de registradores de uso geral, por serem usados para quase todas as tarefas: calcular, contar, armazenar, manipular dados, etc.
Existe também os registradores de segmento, registradores apontadores e registrador de flags, esse último sendo muito importante para o programador, pois através deles se pode saber se dois valores são iguais, maiores ou menores que outros, o sinal (positivo ou negativo), entre outros.
Com a necessidade do aumento da produtividade de software, a linguagem assembly foi substituída por linguagens de alto nível. Atualmente, assembly é usada para escrever drives de computadores, sistemas embarcados, sistemas de tempo real, ou seja, sistemas que necessitam de uma performance crítica, robustez e velocidade.
Referências
http://www.ic.unicamp.br/~pannain/mc404/aulas/pdfs/Art%20Of%20Intel%20x86%20Assembly.pdf
http://pt.wikipedia.org/wiki/História_das_Linguagens_de_Programação