Le istruzioni di ROTATE nei PIC
Le istruzioni che effettuano una rotazione del contenuto
di un registro sono diverse, a seconda della famiglia:
Mid range
|
rrf |
Rotate Right (with carry) |
ruota a destra attraverso il carry |
rlf |
Rotate Left (with carry) |
ruota a sinistra attraverso il carry |
Enhanced
|
rrncf |
Rotare Right No Carry |
ruota a destra senza interessare il carry |
rlncf |
Rotate Left No Carry |
ruota a sinistra senza interessare il carry |
rrcf |
Rotate Right with Carry |
ruota a destra attraverso il carry |
rlcf |
Rotate Left with Carry |
ruota a sinistra attraverso il carry |
Nel set di istruzione del core a 14 bit sono disponibili
due classiche istruzioni che consentono di ruotare un registro attraverso il
bit di Carry dello STATUS.
Le medesime istruzioni, nel set a 16 bit assumono un nome differente, ma la
funzione è la medesima.
14 bit |
16 bit |
funzione |
rrf |
rrcf |
ruota a destra attraverso il carry |
rlf |
rlcf |
ruota a sinistra attraverso il carry |
Questa differenza di denominazione è necessaria perchè
nel set Enhanced esistono anche rotazioni che non coinvolgono il Carry.
Vediamo inizialmente come operano queste due istruzioni.
Rotate Left through
Carry - rlf,
rlcf
La sintassi dell' istruzione è questa:
Sintassi: [label] RLF f, d
Descrizione: Il contenuto del registro f è ruotato di un
bit a sinistra attraverso il Carry.
Se d = w o d = 0, il risultato è salvato in WREG.
Se d = f o d = 1, il risultato è salvato nel
registro f.
Operazione: (f(n)) -> d(n+1),
f(7) -> C, C -> d(0)
Operando: 0 ≤ f ≤ 127, d[0,1]
Flag di STATUS modificati: solo C
Numero cicli necessari all' esecuzione: 1 |
La rotazione a sinistra attraverso il Carry consiste
nelle seguenti operazioni:
|
-
il bit 7 del registro da ruotare viene
passato al Carry
-
tutti gli altri bit si spostano verso
sinistra di una posizione
-
al posto del bit zero viene iniettato il
valore che aveva il Carry prima della rotazione
L' intera sequenza richiede un solo ciclo per
essere eseguita.
|
Bisogna tenere presente che il risultato delle istruzioni
di rotate possono essere indirizzato sia al file che viene ruotato, sia all'
accumulatore WREG.
L' identificazione tra le due possibilità avviene nel sorgente con il
suffisso f o w, per cui la linea
farà ruotare il contenuto del registro f come visto ora.
Ma se il suffisso diventa w, l' operazione eseguita produrrà un diverso
effetto. Quindi:
genererà la seguente situazione:
|
Il bit 7 del registro sarà passato al Carry, come nel caso
precedente.
Il contenuto del registro sarà ruotato, portando il Carry
precedente nel bit 0, ma il valore così ottenuto non sarà salvato
nel registro, bensì si troverà in WREG.
Di conseguenza, il contenuto del registro resta immutato, mentre
cambierà il contenuto di WREG. |
Del tutto analoga la situazione per l' istruzione rlcf,
con le seguenti differenze:
-
diversi flag di STATUS che vengono interessati dal
risultato dell' operazione
-
a causa della maggiore estensione n bit dell' opcode,
il range di f è maggiore
Sintassi: [label] RLCF f,
d(, a)
Descrizione: Il contenuto del registro f è ruotato di un
bit a destra attraverso il Carry.
Se d = w o d = 0, il risultato è salvato in WREG.
Se d = f o d = 1, il risultato è salvato nel
registro f.
Operazione: (f(n)) -> d(n+1),
f(7) -> C, C -> d(0)
Operando: 0 ≤ f ≤ 255, d[0,1]
Flag di STATUS modificati: C,
N, Z
Numero cicli necessari all' esecuzione: 1 |
a è il parametro dell' Access Bank, se posto a 0.
Se a 1 è valida la selezione del banco con i BSR.
Non è necessario indicare questo parametro con MPASM in quanto la sua
gestione è automatica.
Va anche ricordato che, abilitando il set di istruzioni esteso, l' istruzione
opera in Indexed Literal Offset Adderssing con f ≤ 95.
Rotate Left with Carry - rrf,
rrcf
La sintassi dell' istruzione è questa:
Sintassi: [label] RRF f, d
Descrizione: Il contenuto del registro f è ruotato
di un bit a destra attraverso il Carry.
Se d = w o d = 0, il risultato è salvato in WREG.
Se d = f o d = 1, il risultato è salvato nel registro f.
Operazione: (f(n)) -> d(n-1),
f(0) -> C, C -> d(7)
Operando: 0 ≤ f ≤ 127, d[0,1]
Flag di STATUS modificati: solo C
Numero cicli necessari all' esecuzione: 1 |
A specchio, il comportamento della rotazione a destra attraverso il Carry
|
-
il bit 0 del registro da ruotare viene
passato al Carry
-
tutti gli altri bit si spostano verso
sinistra di una posizione
-
al posto del bit 7 viene iniettato il
valore che aveva il Carry prima della rotazione
L' intera sequenza richiede un solo ciclo per
essere eseguita.
|
Come per la precedente istruzione, il risultato può
essere indirizzato sia al file che viene ruotato, sia all' accumulatore WREG.
L' identificazione tra le due possibilità avviene nel sorgente con il
suffisso f o w, per cui la linea
farà ruotare il contenuto del registro f come visto ora.
Ma se il suffisso diventa w, l' operazione eseguita produrrà un diverso
effetto. Quindi:
genererà la seguente situazione:
|
Il bit 0 del registro sarà passato al Carry, come nel caso
precedente.
Il contenuto del registro sarà ruotato, portando il Carry
precedente nel bit 7, ma il valore così ottenuto non sarà salvato
nel registro, bensì si troverà in WREG.
Di conseguenza, il contenuto del registro resta immutato, mentre
cambierà il contenuto di WREG. |
Del tutto analoga la situazione per l' istruzione rrcf,
con le seguenti differenze:
-
diversi flag di STATUS che vengono interessati dal
risultato dell' operazione
-
a causa della maggiore estensione n bit dell' opcode,
il range di f è maggiore
Sintassi: [label] RRCF f,
d(, a)
Descrizione: Il contenuto del registro f è ruotato di un
bit a destra attraverso il Carry.
Se d = w o d = 0, il risultato è salvato in WREG.
Se d = f o d = 1, il risultato è salvato nel
registro f.
Operazione: (f(n)) -> d(n-1),
f(0) -> C, C -> d(7)
Operando: 0 ≤ f ≤ 255, d[0,1]
Flag di STATUS modificati: C,
N, Z
Numero cicli necessari all' esecuzione: 1 |
a è il parametro dell' Access Bank, se posto a 0.
Se a 1 è valida la selezione del banco con i BSR.
Non è necessario indicare questo parametro con MPASM in quanto la sua
gestione è automatica.
Va anche ricordato che, abilitando il set di istruzioni esteso, l' istruzione
opera in Indexed Literal Offset Adderssing con f ≤ 95.
Una possibile funzione di queste istruzioni è l' analisi
bit per bit del contenuto di un registro oppure il suo trattamento come un
registro di scorrimento
|