sábado, 10 de novembro de 2012

O Domínio do Código Máquina

Como aprender a programar o TK90X em linguagem de máquina? Não existe uma única maneira de começar. No meu caso, aprendi o assembly Z80 com o livro do Delio Santos Lima e, na sequência, com o livro de Toni Baker vi como usar essa linguagem no ZX Spectrum.

Esta é a capa do meu exemplar comprado na Litec em 1986.

Houve uma aura mítica sobre o código de máquina e o assembly, pelo qual eu também era deslumbrado. Talvez ainda hoje haja esse deslumbramento entre os fãs de retrocomputação. O interessante em aprender esta linguagem é que permite conhecer bem o funcionamento do computador, mas, para ser sincero, é bastante difícil ser produtivo e fazer algo de útil. No fundo, o que o Z80 faz é transferir bytes de um lugar para outro (registradores, memória ou periféricos), algumas operações simples (adição, subtração e operações booleanas) e desvios no execução do código de máquina. Os desvios (JP, JR, CALL e RET) são particularmente complicados, em especial os condicionais que se baseiam nos flags, cujos comportamentos não são muito intuitivos. Em outras palavras, os desvios condicionais não tem a clareza de uma cláusula "IF ... THEN GOTO ..." (apesar dos cientistas da computação abominarem o GOTO).

Na hora de programar, é muito mais fácil usar uma linguagem de alto nível, como o próprio BASIC do TK90X. Nas linguagens de alto nível, várias operações e funções estão já prontas e disponíveis, a depuração é mais fácil pois vários erros são detectados pelo monitor, existem estruturas sofisticadas de controle de fluxo de execução (IF e THEN, FOR e NEXT, GOSUB, etc.) e, portanto, torna-se mais fácil escrever um programa. Em assembly, as operações e funções devem ser elaboradas praticamente a partir do zero. O uso de rotinas prontas ajuda bastante mas, se não houver uma boa documentação, fica muito difícil entender o que elas fazem, pois decifrar algo em assembly feito por outro programador é um grande desafio.

Apesar disto existe uma grande vantagem de um programa de código em máquina, que é a sua grande velocidade de execução. Linguagens interpretadas como o BASIC Sinclair, apesar de poder em tese fazer praticamente tudo que se faz em assembly, é bastante lenta face às limitações da máquina. Uma solução intermediária seria usar uma linguagem de alto nível em que o programa é compilado, isto é, convertido para a linguagem de máquina. Existem alguns bons compiladores BASIC para o TK90X. Mesmo assim, a programação direta em assembly consegue produzir rotinas melhor otimizadas em velocidade e consumo de memória.

Confesso que nunca fiz projetos grandes em assembly, exceto pelo programa Beta Boot Menu. Mesmo assim é um conhecimento importante, especialmente para quem quer modificar programas. Para quem quiser aprender esta linguagem, uma sugestão é baixar a versão em português (apesar dos termos lusos écran ou ficheiro) do livro no World of Spectrum.

Devo mencionar ainda que o Cláudio Cassens, quando esteve aqui em Curitiba, presenteou-me com o livro original inglês, o "Mastering machine code on your ZX Spectrum". Foi uma grande alegria ter recebido este presente, guardo-o com carinho na minha estante. Qualquer hora eu tenho que comparar os livros, para ver se na tradução alguma coisa foi perdida.

Dados bibliográficos

BAKER, TONI. O domínio do código de máquina no ZX Spectrum. Tradução de Maria da Luz Martins. Lisboa/São Paulo: Editorial Verbo, 1985.

4 comentários:

  1. Li o livro do Willian Tang - Assembly Language for the Absolute Beginner. É ótimo também.
    Mas vou ver esse outro também!

    ResponderExcluir
  2. O meu exemplar de O Domínio do Código Máquina, também comprei na LITEC. Infelizmente não lembro em que ano foi...
    As únicas anotações que tem da época, estão na etiqueta azul da LITEC: REF.1734 PREÇO 158,00 :)

    ResponderExcluir
    Respostas
    1. No meu a REF. é 1734 também, mas o preço era 121500. Não me lembro qual era a moeda na época.

      Excluir

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.