Sobre as diferenças do assembly, temos sintaxes diferentes! Esta tabela resume as principais diferenças das sintaxes Assembly INTEL e AT&T:
Intel | AT&T | |
---|---|---|
Comentários | ; |
// |
Instruções | add |
addq |
Registros | eax , ebx , Etc. |
%eax , %ebx , Etc. |
Imediatos | 0x100 | $ 0x100 |
Indireto | [eax] |
(%eax) |
Indireta geral | [base + reg + reg * scale + displacement] |
displacement(reg, reg, scale) |
Nesse curso trataremos da sintaxe Intel e Assembly x86 usando o sistema Linux, alguns codigo podem não funcionar no Windows, caso queira mostrar um codigo que não funciona no Windows, abra uma Issue!
No assembly usamos o ;
para criar comentarios no codigo!
Além disso, dividimos nosso codigo em seções, vejamos:
Na .data, como o nome sugere, é uma região do código que será usada para tratar as informações, os dados, as variáveis.<
Nesse trecho (geralmente o inicial), declaramos e inicializamos as variáveis.
OBS: Na .bss section, fazemos algo parecido, porém não inicializamos as informações de imediato.
Por fim, a .text section é o local onde irá ficar armazenado suas instruções, que irão trabalhar com os dados previamente declarados. Essa é a única seção obrigatória, pois conterá a label (rótulo) _start, que é o local onde os executáveis são inicializados, _start é como o main() do C.
Comando global: Usado para declarar labels globais, ou seja, passíveis de uso externo.
Geralmente usamos para declarar o label principal, o _start.
Portanto, o nosso esqueleto de código será:
Lembrando que a identação não é nescessária no compilador NASM.