Assembly no Linux/Sintaxes e ferramentas

Existem basicamente dois estilos de representação do código Assembly presentes no Linux e em outros unices. UM deles é o AT&T, que vem acompanhado o Unix desde sua criação e conhecido por muitos. O outro, conhecido pela velha guarda de fuçadores do DOS e também por muitos engenheiros que ao longo do tempo vêm usando estes processadores, seja em um PC ou de forma separada, em projetos de automação, é a sintaxe, ou formato, Intel.

Segue uma breve indicação de diferenças entre ambos. Mais detalhes e até conversores podem ser encontrados facilmente na internet.

PrefixosEditar

  • Intel, não usa prefixos para registros ou valores. Para valores hexa, h ou 0x, para binários, b.
  • AT&T, utiliza % para registradores, e $ para valores, $0 para hexadecimais.

Exemplo:

Intel AT&T
mov eax, 1 movl, $1, %eax
mov ebx, 0ffh movl $0xff, %ebx

Direção dos operadoresEditar

  • Intel, primeiro operador é o destino, segundo a fonte.
  • AT&T, contrário de Intel, primeiro é fonte, segundo destino.

Exemplo:

Intel AT&T
mov eax, [ecx] movl(%ecx), %eax

Operadores de memóriaEditar

  • Intel, utiliza [] para o registro base.
  • AT&T, utiliza () para o registro base.

Exemplo:

Intel AT&T
mov eax, [ebx] movl(%ebx), %eax

SufixosEditar

A sintaxe AT&T utiliza-se de um sistema de sufixos para indicar o tipo de dado, semelhante à linguagem C, com l para long, w para word, b para byte. A sintaxe Intel tem diretivas semelhantes para o uso com operandos de memória, por exemplo: dword ptr, byte ptr, sendo dword igual a long.

Esta pequena explicação deve ajudar a entender certos códigos presentes no Kernel do Linux e também na Internet, em literaturas especializadas. O diretório /arch/i386 do seu código-fonte do kernel, contém em seus subdiretórios vários exemplos de código Assembly.

O maior representante da sintaxe AT&T é o gás, ou as, presente no pacote binutils, e essencial para a compilação do kernel do Linux. O boot e as partes de baixo nível (arquivos .S do kernel) são compilados com ele. Apesar de existente em toda instalação de Linux que é habilitada para compilar um kernel, vamos utilizar o NASM e no TASM. Sua instalação é simples e além de ter uma arquitetura mais avançada e otimizações para os vários tipos de processadores x86, é bem fácil de ser encontrados exemplos e documentações. Além disso, ele abre exceções que facilitam a programação, tais como a representação de hexadecimais, que em Intel seria por exemplo FFh, como 0xff, como utilizamos na linguagem C. Em [5] você pode encontrar mais detalhes sobre ele, bem como código-fonte e instruções para instalação.

Mas realmente não tenho a intenção de iniciar uma guerra santa, do tipo que existe entre os editores Emacs e VI, mas apenas usar o que se mostra mais claro e coerente com o objetivo deste artigo.