Assembly – lezione 2: registri della CPU Intel 8086

Prima di poter programmare in Assembly è necessario, al fine di evitare errori stupidi, capire la struttura interna del processore che si vuole programmare. Dato che programmare insieme, impareremo la struttura interna del processore Intel 8086.

I registri dell’Intel 8086 sono piccole locazioni di memoria di dimensione fissa, utilizzati dall’ALU (Unità Aritmetico Logica) per memorizzare gli operandi dei proprio calcoli. Questi registri hanno tutti la stessa dimensione di 16 bit, quindi gli operandi sono limitati ad un numero pari a 2^16, non possono essere utilizzati liberamente ma ogni registro ha un suo ruolo specifico:

  1. registri general purpose;
  2. registri puntatori e indici;
  3. registri di segmento;
  4. registri speciali.


-registri general purpose:

questi registri sono utilizzati per:

  1. operazioni aritmetiche;
  2. operazioni logiche;
  3. trasferimento di dati.

Ogni registro ha un ruolo specifico e tutti sono lunghi 16bit divisi in 2 parti da 8bit. Andiamo nello specifico:

  1. registro AX: questo registro si divide in AL-AH ed è utilizzato come accumulatore e per le operazioni di tipo I/O, traslazione e operazioni BCD;
  2. registro BX: questo registro si divide in BL-BH ed è utilizzato come base per il calcolo di indirizzi in memoria, sommando a esso specifici offset;
  3. registro CX: questo registro si divide in CL-CH ed è utilizzato come contare, per operazioni ripetute nel tempo;
  4. registro DX: questo registro si divide in DL-DH ed è utilizzato come supplemento per dati, può contenere operandi per divisioni, moltiplicazioni, e gli indirizzi delle porte per I/O.

-registri puntatori e indici:

questi registri sono di 2 tipi

  1. puntatore SP e puntatore BP: questi puntatori (Stack Pointer e Base Pointer) puntano rispettivamente alla cima dello stack e ad un punto all’interno dell stack;
  2. indice SI e indice DI: questi indici (Source Index e Destination Index) sono utilizzati come registri di indirizzamento sorgente e destinazione per movimenti di blocchi di memoria.

-registri di segmento:

questi registri sono utilizzati in coppia con altri e vengono utilizzati per generare indirizzi a 20 bit partendo da una dimensione di 16 bit. I registri sono classificati come segue:

  1. CS (code segment): registro che indica l’inizio della locazione di memoria che contiene il programma da eseguire;
  2. DS (data segment): registro che indica il primo byte della zona di memoria che contiene i dati;
  3. SS (stack segment): registro che indica l’inizio della parte di memoria denominata come stack;
  4. ES (extra segment): registro dinamico utilizzato secondo le esigenze.

I primi 3 registri, contenendo gli indirizzi base delle zone di memoria sommata con degli opportuni offset possiamo accedere all’intera zona di memoria.: infatti la CPU non comunica direttamente ma sommando un offset al’indirizzo base della zone di memoria interessata.

registri speciali:

i registri speciali si dividono in:

  1. IP (istruction pointer): questo registro contiene l’indirizzo della prossima istruzione da eseguire, cioè l’offset da sommare a CS dell’istruzione successiva, nel programma in esecuzione.
  2. FLAG (registro di stato): questo registro è lungo 16bit, composto da 16 celle da 1bit, dove ogni bit ha un significato specifico.

L’Intel ne utilizza solo 9. Questi bit non possono essere modificati dal programmatore, è la CPU che si assume l’incarico: modifica il valore di questi bit (1 o 0) al verificarsi di eventi specifici. I 9 bit sono:

  1. bit Overflow (OF): bit che assume valore 1 se l’operazione eseguita ha riportato un risultato troppo grande;
  2. bit Sign(SF): bit che assume valore 1 se il risultato dell’operazione eseguita è negativo;
  3. bit Zero(ZF): bit che assume valore 1 se il risultato di un operazione è zero;
  4. bit Auxiliary Carry(AF): bit che indica un riporto o un prestito;
  5. bit Parity Flag(PF): bit che assume valore 1 se c’è un numero pari di bit con valore 1 nel risultato dell’operazione;
  6. bit Carry Flag(CF): bit che indica un riporto o un prestito nell’ultimo risultato;
  7. bit Direction(DF): bit che indica se incrementare o decrementare per le istruzioni con le stringhe;
  8. bit Interrupt Enable(IF): bit che indica se le interruzioni mascherate sono abilitate;
  9. bit Trap(TF): bit usato nei debugger per eseguire un passo alla volta. Genera un INT 3 dopo ogni istruzione.

Questo è tutto sui registri, nella prossima lezione approfondiremo lo stack.