ELEMANIA
Z80 - Il registro dei flag
Il registro dei flag (flag register)

Il registro dei flag (flag register), chiamato anche registro di stato, non è un “vero” registro, in quanto è costituito da un insieme di alcuni flip-flop tra loro non omogenei come significato, raggruppati solo per comodità in un apparente unico registro da 8 bit, di cui sono utilizzati solo 6 bit. I singoli bit, detti flag, indicano lo stato del sistema di calcolo dopo l'esecuzione di una operazione aritmetica o logica: ad esempio segnalano se c'è stato riporto, oppure se il risultato dell’operazione è zero.

La figura seguente mostra la composizione interna del registro dei flag:

bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
S Z - H - P/V N C

Il significato dei singoli bit è il seguente:

   

Il registro dei flag, le istruzioni aritmetico-logiche e le istruzioni di salto

Comprendere il funzionamento del registro dei flag è fondamentale per capire come funziona lo Z80. Come si è detto, il registro dei flag tiene traccia del risultato dell'ultima operazione aritmetica o logica che è stata eseguita (se il risultato è zero, positivo, negativo, etc.).

Non tutte le istruzioni agiscono sul registro dei flag, ma solo quelle che implicano la ALU (Unità Aritmetico Logica). Le principali istruzioni che modificano il flag register sono le seguenti:

Istruzioni che modificano il Flag Register
Tipologia Esempi
Aritmetiche ADD, SUB
Incremento/decremento INC, DEC
Confronto CP
Logiche AND, OR, XOR
Bit test BIT
Rotazione SLL, SLA, SRA

L'elenco precedente non è esaustivo ma può dare un'idea. Rimandiamo il lettore a questa tabella più dettagliata per vedere come ogni singola istruzione agisce (oppure no) sul registro dei flag.

Conviene sottolineare fin da subito alcune stranezze o anomalie del funzionamento dello Z80. Per esempio le istruzioni di decremento e incremento a 8 bit (es. DEC B) modificano il registro dei flag, ma non le corrispondenti istruzioni a 16 bit (es. DEC BC). Le istruzioni di input che passano attraverso il registro A (es. IN A,(nn)) non modificano il registro dei flag, mentre le corrispondenti istruzioni che usano C come puntatore lo modificano (es. IN D,(C)).

Il contenuto del registro dei flag viene poi utilizzato dalle istruzioni di salto condizionato per decidere se effettuare il salto oppure no. Facciamo qualche rapido esempio:

        SUB B                 ; A = A - B
        JP NZ, inizio         ; salta a inizio se il risultato della sottrazione è diverso zero 

In alcuni casi bisogna usare l'istruzione di confronto CP, come nel seguente esempio, dove l'istruzione LD A, B non setta il registro dei flag:

        LD A,B            ; carica B in A (non modifica i flag)
        CP 0FFh          ; confronta a con 0FFh (in pratica esegue A-0FFh)
        JP  Z, fine       ; salta a fine se il risultato di CP è zero (cioè se A è uguale a 0FFh)             

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it