Scorrimenti (Shift)
Scorrimenti (Shift)
Scorrimenti (Shift)
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Scorrimenti</strong> (<strong>Shift</strong>)<br />
L’ALU realizza tutte le operazioni aritmetico-logiche del MIPS ad<br />
eccezione degli scorrimenti logici (shift).<br />
sll Rd, Rt, Sa<br />
srl Rd, Rt, Sa<br />
Tutti i bit della parola nel registro Rt vengono spostati a sinistra<br />
(sll) o a destra (srl) di Sa (shift –amount) posizioni; gli spazi che si<br />
liberano vengono riempiti con 0; il risulato viene memorizzato in<br />
Rd.<br />
Esempio.<br />
$2 : 0011 0100 1100 0010 1101 1000 1110 0111<br />
sll $1, $2, 8<br />
$1: 1100 0010 1101 1000 1110 0111 0000 0000<br />
srl $1, $2, 8<br />
$1: 0000 0000 0011 0100 1100 0010 1101 1000<br />
Per la realizzazione di queste istruzioni viene sviluppato un<br />
circuito separato: unità di scorrimento parallelo.
<strong>Shift</strong> a sinistra (sll) di un numero relativo<br />
In generale il valore della sequenza<br />
a31 a30 … .. … ……….. a2 a1 a0<br />
30<br />
è N = a31 × (- 231) + ∑ i=0 ai 2i<br />
Supponiamo che entrambi i bit a31 e a30 siano uguali, allora<br />
29<br />
= - a31 × 231 + a30 × 230 + ∑ i=0 ai 2i<br />
29<br />
= - a31 × 230 - a31 × 230 + a30 × 230 + ∑ i=0 ai 2i (a31 = a30 )<br />
29<br />
= - a30 × 230 - a30 × 230 + a30 × 230 + ∑ i=0 ai 2i<br />
29<br />
= - a30 × 230 + ∑ i=0 ai 2i<br />
Dopo lo shift (sll) di un bit la sequenza diviene<br />
il cui valore è<br />
a30 … .. … ……….. a2 a1 a0 0<br />
- a30 × 231 + ∑ i=0 ai 2i+1 + 0 = 2 · (- a30 × 230 + ∑ i=0 ai 2i )<br />
= 2 × N<br />
30 29
Esempio<br />
0 0 ........ 0 1 1 0 6 = 4+2<br />
0 ........ 0 1 1 0 0 12 = 8+4<br />
Si noti che se a31 e a30 non fossero uguali allora il numero che si<br />
otterrebbe moltiplicando per 2 quello memorizzato NON sarebbe<br />
piu’ rappresentabile.<br />
Esempio:<br />
Con 4 bit possiamo rappresentare gli interi tra - 23 a 23 – 1<br />
0011 ( = 3) 0110 (= 6) OK<br />
0100 ( = 4) 1000??? NO : il numero “con segno” 8<br />
non puo’ essere<br />
rappresentato con 4 bit<br />
1100 ( = - 4) 1000 (= -8) OK<br />
1011 ( = -5) 0110 ??? NO : -10 non puo’ essere<br />
rappresentato con 4 bit
<strong>Shift</strong> a destra (srl) di un numero positivo<br />
Consideriamo ancora la generica sequenza<br />
a31 a30 … .. … ……….. a2 a1 a0<br />
Nell'ipotesi che il numero rappresentato sia positivo (a31 = 0)<br />
il valore del numero rappresentato e'<br />
30<br />
N = ∑ i=0 ai 2i<br />
= 2 · ∑ i=0 ai+1 2i + a0<br />
Dopo lo shift (srl) di un bit la sequenza diviene<br />
il cui valore è<br />
30 29<br />
0 a31 a30 … .. … ……….. a2 a1<br />
∑ i=0 ai+1 2i = ∑ i=0 ai+1 2i (a31 = 0)<br />
= N div 2 (Divisione intera per 2)<br />
29
<strong>Shift</strong> a destra (srl) di un numero negativo<br />
Nell'ipotesi che il numero rappresentato da<br />
a31 a30 … .. … ……….. a2 a1 a0<br />
sia negativo (a31 = 1) lo shift a destra introducendo uno 0 nel bit<br />
del segno certo NON produce la rappresentazione di N div 2.<br />
Esempio<br />
A 0110 6<br />
-A 1010 -6<br />
srl(-A) = 0101<br />
Ci si puo' pero' chiedere cosa succede se si ripone il bit del segno<br />
uguale ad 1.<br />
Nell'esempio precedente avremmo ottenuto 1101 che rappresenta<br />
proprio -3.
<strong>Shift</strong> aritmetico<br />
(<strong>Shift</strong> a destra con trascinamento del segno)<br />
Trasformiamo la sequenza<br />
1 a30 … .. … ……….. a2 a1 a0<br />
30<br />
il cui valore e' N = - 231 + ∑ i=0 ai 2i<br />
in<br />
= 2 × ( - 230 + ∑ i=0 ai+1 2i ) + a0<br />
1 1 a30 … .. … ……….. a2 a1<br />
Calcoliamo il valore della nuova sequenza:<br />
Quindi<br />
29<br />
N' = - 231 + 230 + ∑ i=0 ai+1 2i<br />
29<br />
= - 230 + ∑ i=0 ai+1 2i<br />
N = 2 · N' + a0<br />
29
<strong>Shift</strong> aritmetico e divisione per 2<br />
Domanda:<br />
E' vero che applicare uno shift aritmetico di una posizione ad un<br />
numero negativo si ottiene sempre l'effetto di dividere per 2?<br />
Risposta: NO<br />
Esempio<br />
A 0111 7<br />
-A 1001 -7<br />
Lo shift aritmetico di 1 bit applicato a 1001 produce la sequenza<br />
1100 che rappresenta il numero 4. Ma .........<br />
- 7 div 2 = - (7 div 2) = - 3
<strong>Shift</strong> aritmetico e divisione per 2 (continua)<br />
Siano M ed M' i valori assoluti di N ed N' rispettivamente.<br />
N = 2 × ( - 230 + ∑ i=0 ai+1 2i ) + a0<br />
29<br />
N' = - 230 + ∑ i=0 ai+1 2i<br />
Se N ed N' sono numeri negativi si ha che<br />
M = 2 × ( 230 - ∑ i=0 ai+1 2i ) - a0<br />
29<br />
M' = (230 - ∑ i=0 ai+1 2i )<br />
Pertanto, se a0 = 1 (caso N dispari) allora si ha<br />
M = 2 × M' - a0 = 2 × M' - 1 = 2 × (M' - 1) + 1<br />
Quindi: se N e' un numero negativo dispari allora il valore della<br />
sequenza che si ottiene applicando uno shift aritmetico di un bit<br />
alla rappresentazione in complemento a due di N e'<br />
29<br />
29<br />
(N div 2) - 1