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.