Što su upute za pomak i rotaciju?
Instrukcije pomaka pomiču bitove registra lijevo ili desno. Ovo može biti korisno u različite svrhe, kao što su:
* Množenje ili dijeljenje potencijama broja 2
* Ekstrakcija ili umetanje određenih bitova iz registra
* Obrnuti redoslijed bitova u registru
Postoje dvije glavne vrste instrukcija pomaka:logički pomaci i aritmetički pomaci.
* Logične promjene pomaknuti sve bitove u registru, uključujući bit predznaka. To znači da se vrijednost registra može promijeniti nakon logičkog pomaka.
* Aritmetički pomaci pomaknite samo bitove podataka u registru, a ne bit predznaka. To znači da se vrijednost registra neće promijeniti nakon aritmetičkog pomaka.
Sljedeća tablica prikazuje različite upute za pomak dostupne u većini procesora:
| Uputa | Opis |
|---|---|
| `SHL` | Logički pomak lijevo |
| `SHR` | Logički pomak desno |
| `SAR` | Aritmetika pomaka udesno |
| `ROL` | Zakreni lijevo |
| `ROR` | Zakreni desno |
Upute za rotiranje
Instrukcije rotiranja slične su instrukcijama pomaka, osim što rotiraju bitove registra umjesto da ih pomiču. To znači da će se bitovi na jednom kraju registra pomaknuti na drugi kraj.
Upute za rotiranje mogu biti korisne u razne svrhe, kao što su:
* Generiranje kružnih međuspremnika
* Zamjena sadržaja dvaju registara
* Implementacija određenih kriptografskih algoritama
Sljedeća tablica prikazuje različite upute za rotiranje dostupne u većini procesora:
| Uputa | Opis |
|---|---|
| `ROL` | Zakreni lijevo |
| `ROR` | Zakreni desno |
Primjeri
Evo nekoliko primjera kako se mogu koristiti upute za pomak i rotaciju:
* Za množenje broja s 2, možete upotrijebiti instrukciju pomicanja ulijevo. Na primjer, sljedeći kod množi vrijednost u registru `EAX` s 2:
```
shl eax, 1
```
* Za dijeljenje broja s 2, možete upotrijebiti instrukciju pomicanja udesno. Na primjer, sljedeći kod dijeli vrijednost u registru `EAX` s 2:
```
shr eax, 1
```
* Za izdvajanje najmanje značajnog bajta iz registra, možete koristiti instrukciju pomaka udesno. Na primjer, sljedeći kod izvlači najmanje značajan bajt iz registra `EAX` i pohranjuje ga u registar `AL`:
```
shr eax, 8
mov al, eax
```
* Za umetanje određenog bajta u registar, možete koristiti instrukciju pomaka ulijevo. Na primjer, sljedeći kod umeće vrijednost 0x12 u najmanje značajan bajt registra `EAX`:
```
mov al, 0x12
shl eax, 8
```
* Za obrnuti redoslijed bitova u registru, možete koristiti instrukciju rotiranja ulijevo. Na primjer, sljedeći kod mijenja redoslijed bitova u registru `EAX`:
```
rol eax, 8
```