20.05.2013 Views

Scorrimenti (Shift)

Scorrimenti (Shift)

Scorrimenti (Shift)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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