Mit jelent az eltolási és forgatási utasítás?
A Shift utasítások egy regiszter bitjeit balra vagy jobbra mozgatják. Ez számos célra hasznos lehet, például:
* Szorzás vagy osztás 2 hatványával
* Adott bitek kinyerése vagy beillesztése egy regiszterből
* A bitek sorrendjének megfordítása egy regiszterben
Az eltolási utasításoknak két fő típusa van:logikai eltolás és aritmetikai eltolás.
* Logikai váltások eltolja az összes bitet egy regiszterben, beleértve az előjelbitet is. Ez azt jelenti, hogy a regiszter értéke logikai eltolódás után változhat.
* Aritmetikai eltolások csak az adatbiteket tolja el egy regiszterben, az előjelbitet nem. Ez azt jelenti, hogy a regiszter értéke nem változik egy aritmetikai eltolódás után.
Az alábbi táblázat a legtöbb processzorban elérhető különböző váltási utasításokat mutatja be:
| Utasítás | Leírás |
|---|---|
| "SHL" | Eltolás balra logikai |
| "SHR" | Eltolás jobbra logikai |
| "SAR" | Eltolás jobbra aritmetika |
| "ROL" | Forgatás balra |
| "ROR" | Forgatás jobbra |
Az utasítások elforgatása
A forgatási utasítások hasonlóak a shift utasításokhoz, azzal a különbséggel, hogy eltolás helyett elforgatják a regiszter bitjeit. Ez azt jelenti, hogy a regiszter egyik végén lévő bitek a másik végére kerülnek.
A forgatási utasítások számos célra hasznosak lehetnek, például:
* Kör alakú pufferek generálása
* Két regiszter tartalmának felcserélése
* Bizonyos kriptográfiai algoritmusok megvalósítása
Az alábbi táblázat a legtöbb processzorban elérhető különböző forgatási utasításokat mutatja be:
| Utasítás | Leírás |
|---|---|
| "ROL" | Forgatás balra |
| "ROR" | Forgatás jobbra |
Példák
Íme néhány példa az eltolási és elforgatási utasítások használatára:
* Ha egy számot meg szeretne szorozni 2-vel, használja a Shift balra utasítást. Például a következő kód megszorozza az "EAX" regiszterben lévő értéket 2-vel:
```
shl eax, 1
```
* Egy szám 2-vel való osztásához használhatja a Shift jobbra utasítást. Például a következő kód elosztja az "EAX" regiszterben lévő értéket 2-vel:
```
shr eax, 1
```
* Ha egy regiszterből a legkisebb jelentőségű bájtot szeretné kivonni, használhat egy shift jobbra utasítást. Például a következő kód kivonja a legkisebb jelentőségű bájtot az "EAX" regiszterből, és eltárolja az "AL" regiszterben:
```
shr eax, 8
mov al, eax
```
* Egy adott bájt regiszterbe történő beillesztéséhez használhat egy shift balra utasítást. Például a következő kód beszúrja a 0x12 értéket az "EAX" regiszter legkisebb jelentőségű bájtjába:
```
mov al, 0x12
shl eax, 8
```
* A regiszterben lévő bitek sorrendjének megfordításához használhat egy forgatás balra utasítást. Például a következő kód megfordítja a bitek sorrendjét az "EAX" regiszterben:
```
rol eax, 8
```