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.
Prefixos
editar- 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 operadores
editar- 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ória
editar- Intel, utiliza [] para o registro base.
- AT&T, utiliza () para o registro base.
Exemplo:
Intel | AT&T |
---|---|
mov eax, [ebx] | movl(%ebx), %eax |
Sufixos
editarA 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.