I registri del microprocessore 8086 Nel microprocessore 8086 abbiamo una gran quantità di registri AH AL AX 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 B H B L BX 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 C H C L CX 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 D H D L DX 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 SP 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 BP 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 SI 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 DI 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 CS 0 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 DS 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 SS 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 ES 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 IP 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 0
OF DF IF TF SF ZF AF PF CF FLAG 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 1 I registri denominati AX, BX, CX, DX sono registri di uso generale utilizzabili liberamente all interno di un programma. Essi possono però assolvere ad altre funzioni. In particolare il registro AX costituisce l accumulatore, il principale registro utilizzato nelle operazioni logico-aritmetiche. Il registro BX è utilizzato anche per l indirizzamento indiretto e indiretto con base e indice (vedi modi di indirizzamento) come registro puntatore alla memoria destinato cioè a contenere l indirizzo della locazione di memoria che contiene uno degli operandi coinvolti in un operazione. Molte istruzioni iterative (eseguite cioè più volte in base ad un numero contenuto in un registro che funge da contatore) utilizzano come contatore il registro CX. Il registro DX è coinvolto nelle operazioni di moltiplicazione con risultato a 32 bit e divisione con dividendo a 32 bit. Inoltre, nelle operazioni di IO, può essere utilizzato per contenere l indirizzo della porta di IO coinvolta. Questi registri sono a 16 bit, per cui il parallelismo interno del 8086 è a 16 bit. Tali registri si possono però sdoppiare in registri a 8 bit denominati AH (H sta per high parte alta), AL (L per low parte bassa), BH, BL, CH, CL, DH, DL.
Vi sono poi i registri di uso specifico. SP è lo stack pointer destinato a contenere l indirizzo della cima dello stack all interno del segmento di memoria destinato allo stack (vedi la segmentazione della memoria). Il registro BP è il registro base pointer. Esso ha la funzione di contenere indirizzi della memoria stack e la sua funzione è quella di consentire di accedere a locazioni dello stack senza dover modificare il contenuto dello stack pointer SP. I registri SI (source index) e DI (destination index) vengono utilizzati nelle operazioni di trasferimento dati da una zona di memoria all altra: SI contiene l indirizzo della locazione di memoria da cui provengono i dati e DI contiene l indirizzo della zona di memoria da cui provengono i dati. Il registro dei flag ha un ampiezza di 16 bit anche se ne vengono utilizzati soltanto 9 come appare nella figura seguente OF DF IF TF SF ZF AF PF CF FLAG X X X X 0 1 0 0 1 0 X 1 X 0 X 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Il flag 11 (OF) è il classico flag di overflow e va ad 1 quando segnala che il risultato di un operazione eccede la capacità di rappresentazione del registro destinato a contenerlo. Il flag 10 e il flag di direzione: nelle operazioni di trasferimento di blocchi di dati da una zona di memoria all altra se è a 0 esso indica se i blocchi di dati da trasferire vanno verso indirizzi crescenti (quindi ad ogni trasferimento
dati i registri SI e DI vanno incrementati) mentre se è a 1 esso indica se i blocchi di dati da trasferire vanno verso indirizzi decrescenti (quindi ad ogni trasferimento dati i registri SI e DI vanno decrementati). Il registro IF indica se le interruzioni mascherabili sono abilitate o meno: se vale 0 le interruzioni sono disabilitate per cui ogni segnale di interruzione esterno che giunge sulla linea INTR viene ignorato, mentre se è ad 1 le interruzioni sono abilitate. Il flag TF o flag di Trap posto ad 1 consente il verificarsi di una interruzione software in modo da costringere il microprocessore ad eseguire il programma a passo singolo o single step mode. È un opzione utilizzata quando si sta testando un programma e si vuole controllare lo stato dei registri del microprocessore dopo l esecuzione di ogni singola istruzione. Il flag SF o flag di segno indica il segno del risultato dell ultima operazione eseguita dall ALU. Se il risultato è negativo il flag va ad 1, se il risultato è positivo il flag va a 0. in pratica tale flag coincide con il bit più significativo del risultato. Il flag ZF o flag di zero indica se il risultato dell ultima operazione aritmetica o logica effettuata dall ALU è nullo (ZF=1) o diverso da zero (ZF=0). Il flag AF o auxiliary carry flag è il flag di mezzo riporto corrispondente all half carry dello Z80. esso viene settato se, in una somma si ha un riporto dal nibble inferiore al nibble superiore in una operazione a 8 bit. Se si tratta di
una sottrazione esso segnala un prestito dal nibble più significativo al nibble meno significativo. Nel caso si tratti di operazioni a 16 bit, esso si riferisce ai nibble del byte meno significativo. Tale flag viene utilizzato nelle operazioni in BCD. Il flag PF è il flag di parità. Se il risultato di un istruzione ha un numero di bit ad 1 che sia pari esso viene posto ad 1. Se il risultato contiene un numero di bit ad 1 dispari il flag va a zero. Il flag di carry (CF) viene settato se vi è un riporto o un prestito sul bit più significativo in un addizione o sottrazione. I registri CS, DS, SS e ES sono detti registri di segmento e vengono utilizzati per la segmentazione della memoria.