Kaj so navodila za premikanje in vrtenje?
Navodila za premik premaknejo bite registra v levo ali desno. To je lahko uporabno za različne namene, kot so:
* Množenje ali deljenje s potencami števila 2
* Ekstrahiranje ali vstavljanje določenih bitov iz registra
* Obračanje vrstnega reda bitov v registru
Obstajata dve glavni vrsti navodil za premik:logični premiki in aritmetični premiki.
* Logični premiki premakniti vse bite v registru, vključno z bitom znaka. To pomeni, da se lahko vrednost registra spremeni po logičnem premiku.
* Aritmetični premiki premaknite samo podatkovne bite v registru, ne predznakovnega bita. To pomeni, da se vrednost registra po aritmetičnem premiku ne bo spremenila.
Naslednja tabela prikazuje različna navodila za premik, ki so na voljo v večini procesorjev:
| Navodilo | Opis |
|---|---|
| `SHL` | Premik levo logično |
| `SHR` | Shift desno logično |
| `SAR` | Aritmetika premika v desno |
| `ROL` | Zasukaj levo |
| `ROR` | Zavrti desno |
Navodila za vrtenje
Navodila za vrtenje so podobna navodilom za premikanje, le da vrtijo bite registra, namesto da bi jih premikali. To pomeni, da se bodo biti na enem koncu registra premaknili na drugi konec.
Navodila za vrtenje so lahko uporabna za različne namene, kot so:
* Ustvarjanje krožnih medpomnilnikov
* Zamenjava vsebine dveh registrov
* Izvajanje določenih kriptografskih algoritmov
Naslednja tabela prikazuje različna navodila za vrtenje, ki so na voljo v večini procesorjev:
| Navodilo | Opis |
|---|---|
| `ROL` | Zasukaj levo |
| `ROR` | Zavrti desno |
Primeri
Tukaj je nekaj primerov uporabe navodil za premikanje in vrtenje:
* Če želite število pomnožiti z 2, lahko uporabite ukaz za premik v levo. Naslednja koda na primer pomnoži vrednost v registru `EAX` z 2:
```
shl eax, 1
```
* Če želite število deliti z 2, lahko uporabite ukaz za premik v desno. Naslednja koda na primer deli vrednost v registru `EAX` z 2:
```
shr eax, 1
```
* Za ekstrahiranje najmanj pomembnega bajta iz registra lahko uporabite ukaz za premik v desno. Naslednja koda na primer izvleče najmanj pomemben bajt iz registra `EAX` in ga shrani v register `AL`:
```
shr eax, 8
mov al, eax
```
* Če želite v register vstaviti določen bajt, lahko uporabite ukaz za premik v levo. Naslednja koda na primer vstavi vrednost 0x12 v najmanj pomemben bajt registra `EAX`:
```
mov al, 0x12
shl eax, 8
```
* Če želite obrniti vrstni red bitov v registru, lahko uporabite ukaz zasuka v levo. Naslednja koda na primer obrne vrstni red bitov v registru `EAX`:
```
rol eax, 8
```