Ľudmila Jánošíková

Programovanie v jazyku symbolických adries

pre 32-bitové procesory Intel
Obsah Index
Inštrukcie pre posuv a rotáciu

Inštrukcie pre posuv a rotáciu majú dva operandy:

  • ľavým operandom je register alebo pamäťové miesto (veľkosti bajtu, slova alebo dvojslova), ktorého bity sa posúvajú doprava alebo doľava;
  • pravým operandom môže byť konštanta alebo register CL. Hodnota pravého operandu určuje, o koľko miest sa posunú bity ľavého operandu.

shl register/pamäť, konštanta/CL (shift logical left)

sal register/pamäť, konštanta/CL (shift arithmetic left)

OF SF ZF AF PF CF
* * * ? * *

Inštrukcie shl a sal posúvajú všetky bity ľavého operandu doľava o počet miest zadaných pravým operandom. Do najnižšieho bitu sa zapisuje 0, najvyšší bit operandu sa posúva do príznakového bitu CF (pozri obr. 8). Ak je počet posuvov 1 a pred posuvom boli hodnoty dvoch najvyšších bitov operandu rovnaké, nastaví sa príznak OF na 0, inak sa nastaví na 1. Ak je počet posuvov väčší ako 1, nie je hodnota OF definovaná. Ostatné príznaky sa nastavia podľa výsledku operácie. Hodnota AF je nedefinovaná.

Obr. 8. Inštrukcie shl a sal

Inštrukcie shl a sal sa používajú na rýchle násobenie čísiel bez znamienka dvoma, prípadne 4-, 8- a 16-mi, napr.:

shl dx,4; dx := 16*dx

shr register/pamäť, konštanta/CL (shift logical right)

OF SF ZF AF PF CF
* * * ? * *

Inštrukcia shr posúva všetky bity ľavého operandu doprava o počet miest zadaných pravým operandom. Do najvyššieho bitu sa zapisuje 0, najnižší bit operandu sa posúva do príznakového bitu CF (pozri obr. 9). Ak je počet posuvov 1 a po posuve sú hodnoty dvoch najvyšších bitov operandu rovnaké, nastaví sa príznak OF na 0, inak sa nastaví na 1. Ak je počet posuvov väčší ako 1, nie je hodnota OF definovaná. Ostatné príznaky sa nastavia podľa výsledku operácie. Hodnota AF je nedefinovaná.

Obr. 9. Inštrukcia shr

Inštrukcia shr sa používa na rýchle celočíselné delenie čísiel bez znamienka dvoma, prípadne 4-, 8- a 16-mi.

sar register/pamäť, konštanta/CL (shift arithmetic right)

OF SF ZF AF PF CF
* * * ? * *

Inštrukcia sar posúva všetky bity ľavého operandu doprava o počet miest zadaných pravým operandom. Hodnota najvyššieho bitu sa nemení, najnižší bit operandu sa posúva do príznakového bitu CF (pozri obr. 10). Ak je počet posuvov 1, príznak OF sa vynuluje. Ak je počet posuvov väčší ako 1, nie je hodnota OF definovaná. Ostatné príznaky sa nastavia podľa výsledku operácie. Hodnota AF je nedefinovaná.

Obr. 10. Inštrukcia sar

Inštrukcia sar sa používa na celočíselné delenie čísiel so znamienkom dvoma, prípadne 4-, 8- a 16-mi, napr.:

mov bl,-4 ; bl := -4 = 11111100b
sar bl,1
  ; bl := -2 = 11111110b

rol register/pamäť, konštanta/CL (rotate left)

OF SF ZF AF PF CF
* - - - - *

Inštrukcia rol rotuje všetky bity ľavého operandu doľava o počet miest zadaných pravým operandom. Hodnota najvyššieho bitu operandu sa presúva do najnižšieho bitu a zároveň sa kopíruje do príznakového bitu CF (pozri obr. 11). Ak sa vykonala rotácia o 1 bit a pred rotáciou boli hodnoty dvoch najvyšších bitov operandu rovnaké, nastaví sa príznak OF na 0, inak sa nastaví na 1. Ak je počet rotácií väčší ako 1, nie je hodnota OF definovaná.

Obr. 11. Inštrukcia rol

ror register/pamäť, konštanta/CL (rotate right)

OF SF ZF AF PF CF
* - - - - *

Inštrukcia ror rotuje všetky bity ľavého operandu doprava o počet miest zadaných pravým operandom. Hodnota najnižšieho bitu operandu sa presúva do najvyššieho bitu a zároveň sa kopíruje do príznakového bitu CF (pozri obr. 12). Ak sa vykonala rotácia o 1 bit a po rotácii sú hodnoty dvoch najvyšších bitov operandu rovnaké, nastaví sa príznak OF na 0, inak sa nastaví na 1. Ak je počet rotácií väčší ako 1, nie je hodnota OF definovaná.

Obr. 12. Inštrukcia ror

rcl register/pamäť, konštanta/CL (rotate left through carry)

OF SF ZF AF PF CF
* - - - - *

Inštrukcia rcl rotuje všetky bity ľavého operandu doľava o počet miest zadaných pravým operandom. Hodnota príznakového bitu CF sa presúva do najnižšieho bitu operandu a najvyšší bit operandu sa presúva do CF (pozri obr. 13). Ak sa vykonala rotácia o 1 bit a pred rotáciou boli hodnoty dvoch najvyšších bitov operandu rovnaké, nastaví sa príznak OF na 0, inak sa nastaví na 1. Ak je počet rotácií väčší ako 1, nie je hodnota OF definovaná.

Obr. 13. Inštrukcia rcl

Táto inštrukcia sa uplatňuje pri posuvoch operandov dlhších než veľkosť univerzálneho registra v danom režime procesora. Pretože vo virtuálnom režime môžeme naraz posunúť nanajvýš operand dĺžky 32 bitov, musíme posuv dlhších operandov robiť po častiach. Napr. premennú VelkeCislo typu qword vynásobíme dvoma takto:

shl dword ptr VelkeCislo,1
rcl dword ptr VelkeCislo + 4,1

rcr register/pamäť, konštanta/CL (rotate right through carry)

OF SF ZF AF PF CF
* - - - - *

Inštrukcia rcr rotuje všetky bity ľavého operandu doprava o počet miest zadaných pravým operandom. Hodnota príznakového bitu CF sa presúva do najvyššieho bitu operandu a najnižší bit operandu sa presúva do CF (pozri obr. 14). Ak sa vykonala rotácia o 1 bit a po rotácii sú hodnoty dvoch najvyšších bitov operandu rovnaké, nastaví sa príznak OF na 0, inak sa nastaví na 1. Ak je počet rotácií väčší ako 1, nie je hodnota OF definovaná.

Obr. 14. Inštrukcia rcr

Hore

Načo je vám jazyk symbolických adries?

Architektúra moderných procesorov

Registre

Spôsoby adresovania

Premenné a návestia

Symbolické konštanty

Inštrukčný súbor

Segmentové direktívy

Moduly

Služby operačného systému MS-DOS

Služby operačného systému Windows 95/98/NT/XP

Systémová úroveň vstupu a výstupu

Prostriedky pre prípravu programu

Logické inštrukcie | Skokové inštrukcie
Vydala Žilinská univerzita v Žiline, 2000. ISBN 80-7100-723-4.
Otázky a pripomienky môžete poslať autorke.
Naposledy upravené 28.9.2015.