L’architettura x86 #
Vediamo un’introduzione ad un piccolo ma utile sottoinsieme delle istruzioni disponibili e le direttive assembler del linguaggio assembly x86.
Una descrizione più dettagliata: Intel x86 Instruction Set Reference, o Intel’s Pentium Manuals.
I registri usati in x86-32 #
I processori x86-32 hanno otto general purpose register a 32bit.
I nomi dei registri sono dovuti principalmente a motivi storici: ad esempio,
EAX in passato si chiamava accumulatore, dato che era usato per
numerose operazioni aritmetiche. ECX si chiamava contatore, dato che
veniva usato per contenere l’indice del ciclo.
Due registri sono riservati per special purposes: lo stack pointer (ESP) e il base pointer (EBP).
Accessi parziali #
Per i registri E{A,B,C,D}X possono essere usati dei sottoregistri
più piccoli. Si riferiscono a porzioni di dati più piccole dello
stesso registro.
Ad esempio, EAX è grande 32bit, mentre per accedere ai 16bit meno
significativi si può usare AX. A sua volta si può accedere agli 8 bit
meno significativi di AX tramite AL e agli 8 bit più significativi
di AX tramite AH.
Scrivere dentro ai registri AL, AH o AX lascia invariati
gli altri byte dentro al registro AX, EAX, RAX, per ragioni storiche. Invece, scrivere dentro EAX pone a zero gli altri byte di RAX.
L’esempio visto per EAX vale anche per gli altri registri.
Istruzioni x86 #
Possiamo spostare i dati usando queste istruzioni:
- mov dest, src, copia (non sposta!) il dato riferito da src dentro alla posizione definita da dest.
- push op1, inserisce l’operando op1 sulla testa dello stack.
- pop op1, rimuove l’elemento di testa dello stack (in x86-32 è grande 4-byte) e lo mette dentro op1.
- lea op1, op2, carica l’indirizzo di memoria indicato da op2 dentro al registro indicato da op1.
- lea op1, op2, carica l’indirizzo di memoria indicato da op2 dentro al registro indicato da op1.
Abbiamo a disposizione alcune istruzioni aritmetiche:
- add op1, op2, salva dentro op1 il risultato di op2+op1.
- sub op1, op2, salva dentro op1 il risultato di op2-op1.
E alcune istruzioni logiche, che fanno l’operazione logica indicata e salvano il risultato in op1.
- and op1, op2
- or op1, op2
- xor op1, op2
Istruzioni di controllo di flusso:
- jmp op, salta all’istruzione alla location di memoria specificata dall’operando op.
- cmp op1, op2, compara i valori di due operandi specifici e salva il risultato nella machine status word.
- j<condition> op, a seconda della <condition> e dal contesto della machine status word, salta all’istruzione nella location di memoria indicata dall’operando.