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