ELEMANIA
Z80 - Rotazione, scalamento e manipolazione bit
Istruzioni di rotazione e scalamento

Le istruzioni di rotazione (rotate) e scalamento (shift) operano su dati sempre da 8 bit. L'operando può essere un qualunque registro interno a 8 bit oppure direttamente una locazione di memoria (è una delle "eccezioni" alla solita regola che - per molte altre istruzioni - impone di usare l'accumulatore A come tramite per operare).

Si distinguono operazioni di:

a) Rotazione;
b) Scalamento di tipo logico;
c) Scalamento di tipo aritmetico.

Esaminiamone alcuni esempi (si suggerisce poi di consultare la tabella delle istruzioni per un quadro completo di tutte le combinazioni di operandi possibili).

Istruzioni di rotazione circolare

In queste istruzioni il contenuto di un registro o di una locazione di memoria viene ruotato circolarmente. Per esempio:

        RLCA        ; Rotate Left Circular Accumulator

Questa istruzione di rotazione ruota a sinistra i bit presenti nell'accumulatore, come se appartenessero ad un shift register circolare ad otto posizioni. In pratica ogni bit del registro, dopo l'esecuzione della istruzione, si troverà spostato a sinistra di una posizione: il bit 7, quello più a sinistra, verrà spostato circolarmente in quello più a destra. Si veda la figura qui sotto:

Un dettaglio importante di questa istruzione: il bit 7 viene anche ricopiato nel flag di carry (CY). Non si tratta ovviamente di un riporto aritmetico, ma questa proprietà è interessante perché permette di testare il flag (con una istruzione di salto condizionato, come vedremo) e quindi di conoscere il valore del bit spostato ad ogni rotazione.

L'istruzione di rotazione verso sinistra circolare può operare anche sugli altri registri (B, C, D, E, H, L), oltre che sull'accumulatore. In questi casi l'assembly Z80 presenta una piccola differenza. Si consideri questo esempio:

        RLCA        ; Rotate Left Circular Accumulator
        RLC B       ; Rotate Left Circular B register

Si noti che nel caso del registro B l'istruzione viene scritta in modo un po' diverso (il registro B è cosiderato come un operando separato e non viene incluso nel codice mnemonico dell'istruzione). La spiegazione di questa stranezza sta nel fatto che mentre RLCA è un'istruzione a 8 bit, formata dal solo codice operativo, RLC B (e le altre simili con i registri) è un'istruzione a 16 bit.

Esiste anche un'ananloga istruzione di rotazione circolare verso destra:

        RRCA        ; Rotate Right Circular Accumulator
        RRC D       ; Rotate Right Circular D register

 

Istruzioni di rotazione col carry

Un altro esempio di istruzione di rotazione è:

       RR D         ; Rotate Right D

In questo esempio viene ruotato verso destra il registro D. I bit ruotano ma, a differenza del caso precedente, il bit 0 viene trasferito nel flag di carry, ed il contenuto precedente del carry nel bit 7: insomma il flag di Carry viene sfruttato come fosse un nono bit del registro. In questo caso una rotazione completa avviene eseguendo nove istruzioni consecutive di questo tipo. Si veda la figura qui sotto:

Naturalmente esiste anche un'istruzione di rotazione verso sinistra, che funziona in modo perfettamente analogo:

       RL (HL)      ; ruota a sinistra il contenuto della loc. puntata da (HL)

Anche in questo caso le corrispondenti istruzioni che usano il registro accumulatore vengono indicate in modo un po' diverso:

       RRA         ; Rotate Right Accumulator
       RLA         ; Rotate Left Accumulator

 

Istruzioni di scalamento

Consideriamo ora un esempio di istruzione di scalamento verso sinistra (SLA):

       SLA B      ; Shift Left Arithmetic B

Questa istruzione di scalamento sposta a sinistra i bit presenti nel registro B, inserendo da destra uno zero. Per le istruzioni di scalamento il meccanismo è simile a quello della rotazione, solo che il bit fuoriuscito non viene riportato all'altro lato.

Facciamo un esempio. Supponiamo che nel registro B ci sia inizialmente il numero binario 00010100 (20, in decimale): dopo l'esecuzione della nostra istruzione avremo: 00101000 (40, in decimale). Il bit fuoriuscito viene salvato nel flag di carry (in questo esempio: 0).

Se osservate i due numeri, prima e dopo l'operazione, lo scalamento verso sinistra ed il riempimento del bit più a destra con uno zero, da un punto di vista aritmetico, equivale alla moltiplicazione per due del numero iniziale (l'eventuale overflow viene memorizzato nel flag di carry).

Uno scalamento a destra, invece, può essere di tipo aritmetico o logico: dipende dal trattamento riservato al bit 7. Abbiamo dunque due istruzioni di scalamento verso destra:

       SRL E       ; Shift Right Logic E
       SRA E       ; Shift Right Arithmetic E

Entrambe le istruzioni nell'esempio operano sul registro E. La prima però effettua uno scalamento di tipo logico (srL=Logic) perché, nello scorrimento, da sinistra viene semplicemente inserito uno zero:

Nel secondo esempio, invece, l'operazione è aritmetica perché il bit 7 viene ricopiato su se
stesso. Infatti, così facendo riusciamo a mantenere il segno dell'operando (quando
rappresentato come numero con segno in complemento a due), anche dopo l'operazione di
scalamento. In questo caso l'operazione equivale ad una divisione per due, che vale anche per i
numeri negativi (in complemento a due):


Istruzioni di test e manipolazione bit

Queste istruzioni permettono di esaminare, oppure porre ad '1' o a '0', un particolare bit di
qualsiasi registro della CPU o di una locazione di memoria specificata. Il bit viene indicato con
un numero, che ne identifica la posizione. Ad esempio:

       BIT 0,D         ; testa il bit 0 (quello più a destra, il meno
                          ; significativo) del registro D
       BIT 7, (HL)    ; testa il bit 7 (il più a sinistra, il più significativo)
                          ; della locazione di memoria puntata dal registro HL

Queste istruzioni eseguono il test del bit richiesto, senza utilizzare l'accumulatore. Se il bit
richiesto è zero, viene settato il flag di zero (Z); se il bit è uno, il flag di zero viene azzerato. Un esempio di uso è il seguente:

       BIT 3,C        ; testa il bit 3 del registro C
       JP Z,fine      ; se vale zero salta a fine

Le altre due istruzioni di manipolazione del bit sono la RES e la SET, qui esemplificate:

       RES 5,E         ; azzera il bit 5 (il sesto da sinistra) di E
       SET 1,A         ; setta a uno il bit 1 (il secindi da sinistra) di A

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it