T&T - PIC

 

Le istruzioni ROTATE

 


Le apparentemente strane istruzioni di rotazione sono, in realtą, molto utili in numerose situazioni ed indispensabili nelle operazioni matematiche.

Ad esempio, la rotazione, detta anche shift, a sinistra di una posizione equivale in binario alla moltiplicazione per 2:

 movlw  b'00001100'    ; carica la locazione counter con 12 decimale - 0Ch
 movwf  counter
 bcf    STATUS, C      ; azzera il Carry per iniettare 0 nel bit 0
 rlf    counter, f     ; ruota counter di una posizione verso sinistra

; ora counter contiene b'00011000' ovvero 24 decimale - 18h

Altrettanto, lo shift a destra di una posizione equivale alla divisione per 2:

 movlw  b'00001100'    ; carica la locazione counter con 12 decimale - 0Ch
 movwf  counter
 bcf    STATUS, C      ; azzera il Carry per iniettare 0 nel bit 0
 rrf    counter, f     ; ruota counter di una posizione verso destra

; ora counter contiene b'0000110' ovvero 6 decimale 

Per inciso, osserviamo che la presenza del Carry in questa operazione ha pure un senso preciso. Se effettuiamo:

 movlw  b'00001111'    ; carica la locazione counter con 15 decimale - 0Fh
 movwf  counter
 bcf    STATUS, C      ; azzera il Carry per iniettare 0 nel bit 0
 rrf    counter, f     ; ruota counter di una posizione verso destra

; ora counter contiene b'00000111' ovvero 7 decimale 

Ma 15/2 fa 7.5. Questo č reso dal bit 0, che valeva 1, e che ora passa al Carry ad indicare che l' operazione ha reso un resto (mentre nella precedente il Carry č a zero, indicando una operazione senza resto).

Altrettanto per la rotazione a sinistra:

 movlw  b'11110000'    ; carica la locazione counter con 240 decimale - F0h
 movwf  counter
 bcf    STATUS, C      ; azzera il Carry per iniettare 0 nel bit 0
 rlf    counter, f     ; ruota counter di una posizione verso sinistra

; ora counter contiene b'11100000' ovvero 224 decimale - E0h

Ma 240*2 fa 480. Questo č reso dal bit 7 , che valeva 1 e che passa al Carry ad indicare che l' operazione ha reso un resto. Infatti F0h * 2 = 1E0h, di cui il bit superiore č indicato dallo stato del Carry e i rimanenti 8 bit sono nel counter.

Osserviamo anche la necessitą di azzerare il bit di Carry se vogliamo iniettare uno 0 al posto del bit 0 (o del bit 7 per rrf ) del file da ruotare. Potrebbe rendersi necessario anche settare il Carry per iniettare un 1, a seconda dell' operazione che vogliamo eseguire. 
Inoltre, dato che il bit espulso dalla rotazione va a finire nel Carry , possiamo, testando questo, conoscere il valore del bit shiftato.


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 13/10/14.