20.05.2013 Views

Scorrimenti (Shift)

Scorrimenti (Shift)

Scorrimenti (Shift)

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!