Basicamente existem dois tipos de representações do código
Assembly, muito diferentes e isso vai levar a uma confusão quando se chega na sintaxe AT & T depois de ter aprendido a sintaxe Intel, ou vice-versa, o AT&T vem acompanhando o Unix desde sua criação e já é conhecido por muitos. E a sintaxe Intel também é outra velha conhecida pela velha guarda de fuçadores DOS. Então vamos começar com o básico.
Prefixos
- No Intel não se usa prefixos para registros ou valores.
- Na AT&T no entanto, os registos são prefixados com um '%' e '$' para valores, também usa-se $0x para hexadecimais.
| Intel |
AT&T |
| mov eax,1 |
movl $1,%eax |
| mov ebx,0ffh |
movl $0xff,%ebx |
| int 80h |
int $0x80 |
Direção dos operadores
Sendo muito claro e enxuto: Intel: primeiro operador é o destino, segundo a fonte, AT&T: contrário de Intel, primeiro á fonte, segundo é destino. A vantagem da sintaxe AT&T nesta situação é óbvia. Nós lemos da esquerda para a direita, que escrevemos da esquerda para a direita, de modo que este caminho é apenas natural.
| Intel |
AT&T |
| instr dest,source |
instr source,dest |
| mov eax,[ecx] |
movl (%ecx),%eax |
Operadores de memória
Assim como no exemplo acima os operadores de memória são também diferentes. Intel na sintaxe da base no cadastro está fechado '[]', e na sintaxe AT&T é vedado em '()'.
| Intel |
AT&T |
| mov eax,[ebx] |
movl (%ebx),%eax |
| mov eax,[ebx+3] |
movl 3(%ebx),%eax |
Sufixos
A sintaxe AT&T para obter instruções envolvendo operações complexas é muito obscura, em comparação com a sintaxe Intel. Sendo assim a AT&T utiliza-se de sufixos para indicar o tipo de dado, semelhante à linguagem C, com I para long, W para word(palavra) , b para byte. A sintaxe Intel tem diretivas semelhantes para uso com operadores de memória, por exemplo: dword ptr, byte ptr, sendo dword igual a long, isto é semelhante ao tipo de vazamento em C.
| Intel |
AT&T |
| mov al,bl |
movb %bl,%al |
| mov ax,bx |
movw %bx,%ax |
| mov eax,ebx |
movl %ebx,%eax |
| mov eax, dword ptr [ebx] |
movl (%ebx),%eax |
** NOTA: todos os exemplos a partir daqui serão na sintaxe da AT&T, justamente por estar trabalhando com
Linux.
Até lembrei dos velhos tempos do MSX com o cartucho Mega Assembler. Para aumentar as vidas dos joguinhos era sensacional.