A utilidade do assembly, hoje… meu ponto de vista.

Hoje eu tive o prazer de ser consultado, no Facebook, se o meu antigo curso de assembly, da RBT, poderia ser usado sem transgredir “direitos de copyright”. Minha resposta ao cuidadoso amigo foi que “não há ‘direitos de copyright'” ali. O material é de domínio público e, tenho que dizer, bastante obsoleto. Se bem que a base ainda é válida… Ou seja, “pode usar à vontade, meu querido!”.

Isso me levou a pensar qual é a importância atual do conhecimento da programação em assembly, nesse moderno mundo onde temos Python, Perl, C#, Java, C++ etc.

Definitivamente, programar diretamente em assembly não é mais tão compensador do que era “antigamente”. Os bons compiladores realizam maravilhas no campo da otimização do código final, especialmente se estivermos falando do GCC ou do compilador da C/C++ da Intel (o C/C++ da Microsoft é meio “capado” com relação às opções de otimização, infelizmente, desde a versão 8… ou seja, desde o surgimento do C#).

Eu uso assembly, hoje em dia, em duas ocasiões:

  • Para verificar o código gerado pelo compilador;
  • Para usar recursos que me parecem fracamente implementados pelas bibliotecas disponíveis.

A segunda ocasião quase não acontece. A libc6 v2.13 (eglibc-2.13.38), por exemplo, é muito bem construída!

Vejam os meus posts aqui no blog… A maioria esmagadora das vezes que coloquei listagens em assembly foi com a intenção de analisar o que o compilador C fez com o código oferecido a ele. Faço isso usando a seguinte linha de comando:

$ gcc -O3 -mtune=native -masm=intel -fomit-frame-pointer -fverbose-asm -S codigo.c

Eventualmente adiciono alguma opção de otimização ou recurso extra, como “-msse4.1”, por exemplo.

Com isso eu posso verificar coisas como: se o compilador está gerando código com excessivo uso de registradores temporários, se o código gerado é mais ou menos como eu espero que ele seja, ou se o compilador tomou uma decisão melhor que a minha!

Raramente (mesmo!) desenvolvo algo em assembly diretamente, nos dias de hoje! Mesmo para dispositivos como o microcontrolador PIC ou o Arduino, quanto coloco as mãos neles… Para ambos posso usar versões cross-compiler do GCC (se bem que não lido com o PIC há anos!). A título de exemplo, em 1994 (acho) eu e uns colegas de trabalho desenvolvemos um controlador PID adaptativo, de acordo com a monografia de mestrado de um desses colegas, inteiramente em C, num IBM PS/2 Modelo 50Z… Usando o Borland C++ Builder 3.1 (que era muito bom!!). Nada de assembly! Mas, é claro, fiz estensivo uso das listagens geradas em assembly para verificar o que estava sendo gerado e melhorando o código, em C.

Anúncios

2 comentários sobre “A utilidade do assembly, hoje… meu ponto de vista.

  1. O GCC provê um construtor especial, asm, para inserir instruções
    de linguagem de montagem em C

    asm()
    : operandos de saida
    : operandos de entrada
    : lista de registradores afetados tem outra forma de inserir instruções ou essa e a unica forma ?

    1. Mais ou menos isso… mas, como te falei, o asm inline do gcc usa, por default, a notação AT&T (nada impede de usar a notação intel, basta usar a chave -masm=intel ou colocar “.intel_syntax noprefix” no início da string do bloco asm.

      O problema é que, ao usar GCC, você pode querer tornar seu código independente de arquitetura… Usar ASM, então, dificulta as coisas…

      Além disso… na construção __asm__(“blocoasm” : outregs : inregs : clobberregs), a forma de especificar registradores é um pouco diferente do que o asm direto…

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s