Scorrimenti (Shift)

Transcript

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