Assembly, assembler e linguagem de maquina
São Coisas Diferentes
Existem três conceitos diferentes, mas relacionados, que as pessoas frequentemente confundem. Vamos esclarecer cada um deles.
Assembly
Assembly é uma linguagem de programação composta por mnemônicos simples. Ela corresponde diretamente às instruções da plataforma utilizada. Ao escrever código em Assembly, você sabe exatamente o que o processador está fazendo e tem acesso a recursos que podem não estar disponíveis em linguagens de alto nível. Podemos chamar Assembly de uma linguagem de baixo nível, o que significa que está mais próxima do hardware.
Assembler
Assembler é o montador, um programa que lê o arquivo com os mnemônicos da linguagem Assembly e converte em linguagem de máquina. Ele atua como o compilador.
Linguagem de Máquina
A linguagem de máquina é a única que o processador consegue interpretar. Ela é composta apenas por códigos, tornando-a ilegível para humanos. Com prática, é possível reconhecer alguns códigos em hexadecimal e relacioná-los com seus mnemônicos em Assembly. Por exemplo, na plataforma 8086, a instrução NOP é 0x90 e 0xCD é o código para chamar uma interrupção. Já na plataforma Z80, NOP é 0x00.
Exemplos
Olá Mundo em DOS x86 16 bits
ORG 100h
section .text
MOV AH, 40h
MOV BX, 1
MOV CX, 11
MOV DX, msg
INT 21h
MOV AL, 1
MOV AH, 4Ch
INT 21h
section .data
msg db "hello world"
Programa Compilado pelo Assembler
B4 40 BB 01 00 B9 0B 00 BA 14 01 CD 21 B0 01 B4
4C CD 21 00 68 65 6C 6C 6F 20 77 6F 72 6C 64
Aplicação nos Dias de Hoje
Antigamente, Assembly era a única opção além de digitar diretamente os códigos de máquina. Hoje, isso mudou, mas Assembly continua sendo uma linguagem importante e faz parte do código de muitas linguagens modernas.
Ela é usada para acessar instruções de criptografia por hardware ou para obter máxima velocidade em tarefas importantes, como a troca de contexto em linguagens modernas como Go.
Aprender Assembly é entender como os computadores funcionam internamente. Todo programador profissional que leva seu trabalho a sério deveria aprender Assembly.
O Computador
Para entender melhor como as partes de um computador funcionam, sugiro escrever um emulador. Não precisa ser completo; pode ser apenas um pequeno interpretador que lê e executa binários, simulando um interpretador e um pouco de RAM.
Criei um exemplo de emulador limitado com o objetivo de ser didático. Se tiver dúvidas sobre o conceito ou funcionamento, me avise.