Intel x86 Instruction Set
Il set di istruzioni Intel x86 è un insieme di comandi che una CPU può eseguire. Consideralo come il linguaggio nativo del computer, composto da istruzioni precise e concise che indicano al processore cosa fare. Queste istruzioni possono essere semplici come sommare due numeri o complesse come gestire la memoria.
Ogni istruzione nel set di istruzioni x86 è composta da un codice operativo (opcode) e da operandi (dati).
Il codice operativo specifica l'operazione da eseguire, mentre gli operandi forniscono i dati su cui agisce l'operazione. Ad esempio, l'istruzione ADD EAX, 1 indica alla CPU di aggiungere il valore 1 al contenuto del registro EAX.
Modalità di indirizzamento
Le modalità di indirizzamento definiscono come la CPU deve interpretare gli operandi.
L'architettura x86 supporta diverse modalità di indirizzamento, tra cui:
- Immediato: l'operando è un valore costante. Ad esempio, MOV EAX, 5 sposta il valore 5 nel registro EAX.
- Registro: l'operando è un registro. Ad esempio, MOV EAX, EBX copia il contenuto del registro EBX nel registro EAX.
- Diretto: l'operando è un indirizzo di memoria. Ad esempio, MOV EAX, [0x00400000] sposta il valore all'indirizzo di memoria 0x00400000 nel registro EAX.
- Indiretto: l'operando è un indirizzo di memoria contenuto in un registro. Ad esempio, MOV EAX, [EBX] sposta il valore all'indirizzo memorizzato nel registro EBX nel registro EAX.
Istruzioni comuni
ISTRUZIONI PER LO SPOSTAMENTO DEI DATI
- MOV: Copia i dati da una posizione a un'altra. Ad esempio, MOV EAX, EBX copia il contenuto di EBX in EAX.
- PUSH e POP: Aggiunge e rimuove dati dallo stack. Ad esempio, PUSH EAX inserisce il contenuto di EAX nello stack e POP EAX rimuove il valore in cima allo stack in EAX.
ISTRUZIONI ARITMETICHE
- ADD e SUB: Eseguono addizione e sottrazione. Ad esempio, ADD EAX, 2 aggiunge 2 al contenuto di EAX, mentre SUB EAX, 1 sottrae 1 da EAX.
- MUL e DIV: Eseguono moltiplicazione e divisione. Ad esempio, MUL EBX moltiplica il contenuto di EAX per EBX, memorizzando il risultato in EAX e EDX.
ISTRUZIONI LOGICHE
- AND, OR e XOR: eseguono operazioni logiche bit a bit. Ad esempio, AND EAX, EBX esegue un'operazione AND bit a bit tra EAX ed EBX, memorizzando il risultato in EAX.
- NOT e NEG: eseguono NOT bit a bit e negazione aritmetica. Ad esempio, NOT EAX inverte tutti i bit in EAX.
ISTRUZIONI DI CONTROLLO DEL FLUSSO
- JMP: salta incondizionatamente a un indirizzo specificato. Ad esempio, JMP 0x00400000 salta all'istruzione all'indirizzo 0x00400000.
- JE, JNE, JG, JL: salti condizionati basati sul confronto di valori. Ad esempio, JE 0x00400000 salta all'indirizzo se il flag zero è impostato, a indicare l'uguaglianza.
- CALL e RET: chiamata e ritorno dalle procedure. Ad esempio, CALL 0x00400000 salta alla procedura all'indirizzo specificato, mentre RET ritorna dalla procedura.
Programma di esempio
section .data
; Declare data segment
num1 db 5
num2 db 10
result db 0
section .text
global _start
_start:
; Load numbers into registers
mov al, [num1]
mov bl, [num2]
; Add numbers
add al, bl
; Store result
mov [result], al
; Exit program
mov eax, 1 ; syscall number for exit
xor ebx, ebx ; return code 0
int 0x80 ; call kernel
Questo programma:
- Dichiara tre variabili: num1, num2 e risultato.
- Carica i valori di num1 e num2 nei registri AL e BL.
- Somma i valori in AL e BL, memorizzando il risultato in AL.
- Sposta il risultato da AL alla variabile risultato.
- Esce dal programma chiamando la syscall exit.