Che cosa sono le istruzioni di spostamento e rotazione?
Le istruzioni di spostamento spostano i bit di un registro a sinistra o a destra. Questo può essere utile per vari scopi, come ad esempio:
* Moltiplicazione o divisione per potenze di 2
* Estrazione o inserimento di bit specifici da un registro
* Inversione dell'ordine dei bit in un registro
Esistono due tipi principali di istruzioni di spostamento:spostamenti logici e spostamenti aritmetici.
* Cambiamenti logici sposta tutti i bit in un registro, incluso il bit di segno. Ciò significa che il valore del registro può cambiare dopo uno spostamento logico.
* Spostamenti aritmetici sposta solo i bit di dati in un registro, non il bit di segno. Ciò significa che il valore del registro non cambierà dopo uno spostamento aritmetico.
La tabella seguente mostra le diverse istruzioni di spostamento disponibili nella maggior parte dei processori:
| Istruzioni | Descrizione |
|---|---|
| "SHL" | Spostamento a sinistra logico |
| "SHR" | Spostamento a destra logico |
| `SAR` | Shift aritmetico a destra |
| `ROL` | Ruota a sinistra |
| `ROR` | Ruota a destra |
Istruzioni di rotazione
Le istruzioni di rotazione sono simili alle istruzioni di spostamento, tranne per il fatto che ruotano i bit di un registro invece di spostarli. Ciò significa che i bit da un'estremità del registro si sposteranno all'altra estremità.
Le istruzioni di rotazione possono essere utili per diversi scopi, tra cui:
* Generazione di buffer circolari
* Scambio del contenuto di due registri
* Implementazione di alcuni algoritmi crittografici
La tabella seguente mostra le diverse istruzioni di rotazione disponibili nella maggior parte dei processori:
| Istruzioni | Descrizione |
|---|---|
| `ROL` | Ruota a sinistra |
| `ROR` | Ruota a destra |
Esempi
Ecco alcuni esempi di come possono essere utilizzate le istruzioni di spostamento e rotazione:
* Per moltiplicare un numero per 2, puoi utilizzare l'istruzione di spostamento a sinistra. Ad esempio, il codice seguente moltiplica il valore nel registro "EAX" per 2:
```
shl eax, 1
```
* Per dividere un numero per 2, puoi utilizzare l'istruzione di spostamento a destra. Ad esempio, il codice seguente divide il valore nel registro "EAX" per 2:
```
shr eax, 1
```
* Per estrarre il byte meno significativo da un registro, è possibile utilizzare un'istruzione di spostamento a destra. Ad esempio, il codice seguente estrae il byte meno significativo dal registro "EAX" e lo memorizza nel registro "AL":
```
shr eax, 8
mov al, eax
```
* Per inserire un byte specifico in un registro, è possibile utilizzare un'istruzione di spostamento a sinistra. Ad esempio, il codice seguente inserisce il valore 0x12 nel byte meno significativo del registro "EAX":
```
movimento al, 0x12
shl eax, 8
```
* Per invertire l'ordine dei bit in un registro, è possibile utilizzare un'istruzione di rotazione a sinistra. Ad esempio, il codice seguente inverte l'ordine dei bit nel registro "EAX":
```
rolax, 8
```