ASM Shift e Rotate

Stato
Discussione chiusa ad ulteriori risposte.
Ultima modifica:
SHL = SHift logical Left (scorrimento logico verso sinistra)
L'operando DEST subisce uno scorrimento logico dei suoi bit verso sinistra il cui contenuto viene trattato come numero intero senza segno. L'operando SRC indica il numero di scorrimenti da effettuare. I posti rimasti liberi a destra vengono riempiti con zeri.
Per ogni scorrimento, il bit che "trabocca" a sinistra viene salvato nel flag CF (Carry Flag).
Esempio:
AX = 0111001110110110b (DEST)
CL = 5 (SRC)
con:
SHL AX, CL
la CPU effettua questi passaggi:
AX = 1110011101101100b; CF = 0
AX = 1100111011011000b; CF = 1
AX = 1001110110110000b; CF = 1
AX = 0011101101100000b; CF = 1
AX = 0111011011000000b; CF = 0
Un uso comune di questa istruzione è la moltiplicazione per una potenza di 2 (più rapido di MUL). In generale: moltiplicare un numero intero senza segno m, espresso in base b, per un fattore b^n (n intero positivo), equivale ad aggiungere n zeri alla destra dello stesso m; in questo modo, tutte le cifre di m vengono fatte scorrere di n posti verso sinistra.
SHR = SHift logical Right (scorrimento logico verso destra)
Stessa cosa di SHL ma verso destra. Gli spazi vuoti rimasti a sinistra vengono riempiti con zeri. Uso comune: divisione per una potenza di 2 (più rapido di DIV).

SAL = Shift Arithmetic Left (scorrimento aritmetico verso sinistra)
Stessa cosa di SHL ma il contenuto dell'operando DEST viene trattato come numero intero CON segno in complemento a 2.
Gli spazi vuoti rimasti a destra vengono riempiti con degli zeri (vedremo dopo perché).
Cosa cambia praticamente tra SHL e SAL? Niente. Questa istruzione è fornita solo per simmetria con l'istruzione SAR (sotto).
SHL e SAL sono quindi interscambiabili.
SAR = Shift Arithmetic Right (scorrimento aritmetico verso destra)
Stessa cosa di SHR ma, come SAL, il contenuto dell'operando DEST viene trattato come numero intero CON segno in complemento a 2.
Questa volta però gli spazi vuoti rimasti a sinistra vengono riempiti secondo il segno dell'operando. Se il bit più significativo era 0 (segno positivo) allora verranno riempiti con 0. Se il bit più significativo era 1 (segno negativo) allora verranno riempiti con 1. Lo shift aritmetico praticamente si distingue dallo shift logico per il fatto che mantiene il segno originale del numero che subisce lo shift (DEST). è per questo che SAL e SHL sono uguali: i bit meno significativi (a destra) non hanno importanza per il segno, riempiendoli con 0 il segno viene mantenuto.

Ror e Rol effettuano una rotazione. Il bit "che esce" non va nel flag CF, ma rientra dalla parte opposta alla quale è uscito.
 
  • Mi piace
Reazioni: NichyXD e Guè
Di solito si usano per vedere se un numero è pari o dispari guardando il bit di carry :) sono quasi tutte uguali poi dipende da cosa vuoi veramente fare ;)
 
Stato
Discussione chiusa ad ulteriori risposte.