Assembly x86
Linguaggio testuale equivalente a linguaggio macchina, ogni programma deve essere tradotto in assembly per essere interpretato dalla macchina.
ISA
Le istruzioni eseguibili da una CPU sono definite dal instruction set architecture (ISA), differente per ogni tipo di architettura. In questo caso si fa riferimento all'architettura x86 versione AMD64 (AT&T).
OSS
Per disassemblare un programma ed ottenere il codice assembly equivalente si può usare il comando da terminale: objdump -d -S nome_file (oppure).
Scheletro programma assembly
Solitamente si iniziano i programmi con .globl istruzione che serve per mandare il processore in idle alla fine del programma HLT.
Direttive assembly
- .org address, fill => Imposta location counter (indirizzo assoluto), imposta byte a fill.
- .equ symbol, expression => Definisce una costante (equivalente a symbol = expression).
- .byte expression => Riserva memoria di (expression*byte).
- .word expression => Riserva memoria di (expression*word).
- .long expression => Riserva memoria di (expression*long).
- .quad expression => Riserva memoria di (expression*quad).
- .asciz "string" => Riserva memoria per vettore di caratteri impostato a "string".
- .fill repeat, size, value => Riserva memoria di (repeat celle * dimensione size) e le imposta a value. Default size = 1, value = 0.
- .comm symbol, length => Dichiara area di memoria con nome symbol e dimensione length nella sezione bss del programma.
- .handleridn / idn => Identifica inizio routine di servizio associata a idn.
- .data => Delimita la sezione contenente la sezione data del programma.
- .text => Delimita la sezione contenente la sezione testo del programma.
OSS
Le assegnazioni in assembly si effettuano tramite “:”.
Tipi di dato C e suffisso
L’accesso a memoria avviene in due passi:
- Si salva l’indirizzo della locazione di memoria in un registro.
- Si accede al contenuto dell’indirizzo tramite l’operando (%registro) o tramite l’operando (%base, %indice, %scala).
Nota: Sono quindi equivalenti ai puntatori alle locazioni di memoria in C.
| Tipo | Suffisso | Byte |
|---|---|---|
| CHAR | B | 1 |
| SHORT | W | 2 |
| INT | L | 4 |
| DOUBLE | Q | 8 |
Operandi
- TIPO
- SUFFISSO
- Registro %
- Immediato $
- Memoria (%registro)
- Scala può valere
- Memoria (aritmetica dei puntatori)
- Immediato (%base, %indice, %scala) solo: 1, 2, 4, 8
- Esadecimale (indirizzo) 0x
- Immediato (Base, indice, scala) => (base + (indice * scala)) + immediato
Con MOV => base[indice + imm] (imm deve essere multiplo di scala che deve corrispondere con il tipo della base)
I registri general purpose (64bit)
| 64 bit | 32 bit | 16bit | 8bit Nome |
|---|---|---|---|
| %RSP | %ESP | %SP | Stack pointer |
| %RBP | %EBP | %BP | Base pointer |
| %RAX | %EAX | %AX | %AL Accumulatore Base |
| %RBX | %EBX | %BX | %BL Contatore |
| %RCX | %ECX | %CX | %CL Dati |