Rafa X

Blog pessoal com assuntos aleatórios sobre reflexões, tecnologia, educação, arte, e afins.

O poder do Assembly

O poder do Assembly

Ontem escrevi um post sobre porque é importante um programador aprender a linguagem C, sobre a importancia dela em conhecermos como um computador funciona por debaixo do capô, se quiserem ler depois clique aqui nesse link.

No post de ontem, eu disse que a linguagem C dá acesso direto ao hardware da máquina. Neste post, pretendo mostrar para vocês que ainda dá para mergulhar mais fundo nas entranhas da máquina usando a linguagem Assembly.

Com Assembly, é quase como criar um programa “na unha”: você escreve cada instrução específica do hardware que deseja que seu programa execute, cada movimento de dados entre registradores da CPU e a memória, cada pixel desenhado na tela, cada instrução da arquitetura. Você escreve tudo manualmente quando programa em Assembly. Isso dá ao programador controle total sobre o hardware.

Porém, programar em Assembly não é simples. Para algo trivial como escrever a frase “Olá mundo” na tela, você precisa de diversas linhas de código. Em outras linguagens, com uma ou poucas linhas você faz isso facilmente. Veja um exemplo de um programa que escreve “Olá mundo” na tela, em Assembly e em Python:

Assembly:

; Boot sector: imprime "Olá mundo" diretamente na memória de vídeo (modo texto)
; Tamanho final deve ser 512 bytes com assinatura 0x55AA

org 0x7C00

mov ax, 0xB800
mov ds, ax          ; segmento da memória de vídeo
mov si, msg         ; ponteiro para a string
mov di, 0           ; posição inicial (coluna 0, linha 0)

print_loop:
lodsb ; carrega próximo caractere em AL
cmp al, 0
je done ; fim da string

mov [di], al        ; caractere
mov byte [di+1], 0x0F ; atributo (branco brilhante)
add di, 2           ; próximo caractere na tela
jmp print_loop

done:
jmp $ ; trava o bootloader (loop infinito)

msg db "Olá mundo", 0

times 510 - ($ - $$) db 0
dw 0xAA55

Python:

print("Olá mundo")


Perceberam a diferença? Em Assembly precisamos de diversas linhas para escrever um programa que mostre a frase “Olá mundo” na tela, enquanto em Python basta uma linha simples.

A principal vantagem do Assembly é o controle absoluto sobre o hardware, mas a complexidade é alta, o desenvolvimento é mais demorado e mais custoso, mesmo para tarefas simples.

Outra vantagem do Assembly, e em segundo lugar da linguagem C, é que programas escritos nessas linguagens são executados com performance máxima, utilizando o mínimo de memória RAM e aproveitando ao máximo o hardware, pois não existem camadas intermediárias como em outras linguagens. O programa conversa diretamente com o sistema operacional e o hardware da máquina.

Tanto C quanto Assembly ainda são amplamente utilizados quando precisamos de máxima performance, como em dispositivos embarcados, onde cada byte e cada ciclo de processamento não podem ser desperdiçados.

Para quem não sabe, programar para dispositivos embarcados significa criar programas que serão executados em chips de equipamentos eletrônicos, brinquedos (como uma boneca que fala “mamãe” quando apertada), marca-passos, equipamentos médicos, robôs industriais, módulos de sondas espaciais, lâmpadas inteligentes, entre muitos outros exemplos. Para tudo isso funcionar, existe um programa rodando dentro desses chips.

Esses dispositivos possuem memória e velocidade de processamento extremamente limitadas em relação aos computadores que usamos no dia a dia. Por isso, o programa não pode desperdiçar bytes de memória nem ciclos de processamento. Cada instrução deve ser pensada para caber no espaço limitado e aproveitar ao máximo o hardware. Por isso, linguagens como C e Assembly são as mais indicadas nesses casos.

Aliás, você sabia que os jogos de videogame antigos eram programados somente em Assembly? Isso acontecia por causa dos recursos extremamente limitados do hardware da época.

Conhecer a linguagem Assembly do hardware que está sendo programado dá ao programador um conhecimento diferenciado que muitos não possuem.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *