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.
|