Estudando Assembly

Quando eu comecei a programar, na era do 8bits, aprender um pouco de assembly era inevitável, as maquinas eram muito mais simples que os computadores atuais e geralmente nem mesmo tínhamos um compilador a mão, no lugar digitávamos pequenos trechos de opcodes diretamente em hexadecimal.

Isso era incrivelmente útil para contornar limitações do BASIC que servia tanto como linguagem de programação como sistema operacional. (diretamente gravado na ROM da máquina)

Nessa época toda revista de informática vinha com exemplos de código e muitas vezes programas inteiros.

“Se você sabe assembly, todo programa é de código aberto."

Com a evolução dos micro-computadores para 16bits, as maquinas ficaram mais interessantes, mas ainda muito menos potentes que as atuais. Apesar de já termos compiladores e interpretadores ótimos para várias linguagens, muitos programas e até sistemas operacionais inteiros ainda eram escritos em assembly simplesmente para que pudessem funcionar em um ambiente tão limitado.

Com processadores como o 80286 e depois com o 80386 ouve uma grande melhora nos processadores, agora era possível ter memória mapeada e modo protegido, uma característica que antes era apenas dos grandes computadores agora estava disponível para computadores domésticos.

Ainda assim, levou um bom tempo até surgirem sistemas operacionais que tirassem proveito do modo protegido. É difícil explicar como era programar em uma época que seu programa tem acesso a absolutamente qualquer parte da máquina. 

Sem modo protegido seu programa pode fazer o que bem entender, pode alterar qualquer bit na RAM, pode alterar a tabela de interrupções e quando seu programa está rodando ele é o rei, nenhum outro programa pode assumir o controle se seu programa não permitir.

Claro que também se seu programa travar, a única coisa que você pode fazer é reiniciar a máquina.

Com os sistemas operacionais modernos trabalhando em modo protegido, não é mais possível acessar o hardware diretamente, é necessário sempre passar pelo kernel, isso torna os sistemas muito mais seguros, mas também tira muito da graça e do controle que tínhamos.

As máquinas são muito mais poderosas e os compiladores muito mais espertos e não é mais necessário descer para o assembly toda vez que se quer fazer algo mais interessante.

Assembly hoje em dia

Quais os motivos para se estudar assembly já que as máquinas são tão poderosas e não temos mais o controle que tínhamos? 

  • Entender como os computadores funcionam. Saber como o sistema funciona debaixo do capô faz com que seus sistemas sejam mais eficientes, sistemas eficientes gastam menos dinheiro mesmo que você programe em uma linguagem de alto nível e todo seu software esteja “na nuvem”. Saber assembly também vai ajudar no debug, ajudando a entender erros no código mesmo que você programe em linguagens de alto nível.

  • Análise forense, segurança e engenharia reversa. Uma área cada vez mais forte precisa de profissionais que consigam analisar peças de software e encontrar possíveis falhas de segurança, assim como encontrar determinar se um software é malicioso.

  • Criação de firmware. Microcontroladores modernos ajudam muito a simplificar e baratear projetos que antes eram simplesmente caros demais. Além disso, é cada vez mais simples adicionar novas funcionalidades como, por exemplo, conexão com WiFi com a simples adição de um módulo, mas para tudo isso alguém tem que escrever o software, testar e como microcontroladores são bastante limitados, muitas vezes é necessário usar assembly seja para o desenvolvimento de partes críticas, seja para depurar erros.

  • Otimização para desempenho, tamanho, etc. Boa performance significa melhor competitividade, seja barateando custos de infraestrutura, seja para que a interface com o usuário, seja mais fluida ou para que o consumo de eletricidade seja mais eficiente. Saber como a máquina funciona e como tirar proveito das suas capacidades vai ajudar a ter um produto melhor, mesmo que você não desenvolva diretamente em assembly, mas sabe o que seu compilador está fazendo e como fazer com que o resultado seja ótimo. 

  • Ainda sobre otimização e desempenho, existe uma cultura toda errada de que otimização é a raiz de todo mal, etc. Isso é usado como desculpa para escrever software ruim e software ruim morre assim que algo melhor aparece. Um exemplo bem claro disso é o que houve com o Windows CE, antes do iPhone aparecer, o Windows dominava os portáteis e tinha muitos recursos, editor de texto, planilha eletrônica, etc. Mas era lento, quando o iPhone surgiu ele não tinha nada, não havia Apple Store, não havia aplicativos, nada, mas o sistema era rápido tornando a experiência do usuário muito mais agradável, o Windows CE nunca mais se recuperou mesmo tendo dominado o mercado bastou surgir um concorrente mais eficiente. 

  • Sobre otimização para tamanho, o maior argumento hoje em dia para investir em escrever software mais eficiente é que se seu software é muito grande, seja um aplicativo ou mesmo uma página web, existe uma boa chance de seu potencial cliente desistir porque ele não está em uma boa situação de conectividade e seu software simplesmente demorou muito tempo para baixar.

  • Porque você é um hacker massivo e não aguenta ficar sem saber como as coisas funcionam bit a bit. Esse sem dúvida é o motivo mais divertido para aprender assembly.

Note que muitas vezes você nem mesmo precisa programar diretamente em assembly para tirar proveito de conhecer essa linguagem. Você aprendeu o funcionamento dos computadores no nível do hardware e isso permite que você escreva software melhor mesmo em outras linguagens, afinal, não importa a linguagem que você escolha, depois de passar por todas as camadas do sistema operacional, virtualização, etc. seu código ainda tem que ser executado pelo hardware.

Assembly, Assembler e linguagem de máquina. 

Aqui usei assembly abrangendo todo um conceito, por exemplo, quando código diretamente em hexadecimal la nos computadores de 8bits, na verdade isso não é assembly, estamos digitando diretamente em linguagem de máquina. Eu explico um pouco sobre isso no texto Assembly, Assembler e linguagem de máquina.

Por onde começar

A parte mais difícil para iniciar em qualquer linguagem de programação é a configuração do ambiente de desenvolvimento. Para assembly temos ainda uma complexidade adicional, é preciso definir qual plataforma você vai estudar porque como assembly é muito próximo do hardware e do sistema operacional, cada plataforma vai ter uma configuração específica e seria impossível cobrir todas. Entretanto, escrevi alguns textos que podem ajudar.

Cesar Gimenes

Última modificação