1 9. CELOBROJNA ARITMETIKA 9.1 Instrukcije pomeranja i rotacije Instrukcije pomeranja su jedna od glavnih karakteristika asemblerskog jezika. Pomeranje označava pomeranje bitova levo ili desno unutar operanda. U tabeli 1 su prikazane instrukcije pomeranja, koje sve utiču na Overflow i Carry flegove. Tabela 1. Instrukcije pomeranja i rotacije Mnemonik Opis SHL Shift left (pomeraj ulevo) SHR Shift right (pomeraj udesno) SAL Shift arithmetic left (aritmetičko pomeranje ulevo) SAR Shift arithmetic right (aritmetičko pomeranje udesno) ROL Rotate left (rotacija ulevo) ROR Rotate right (rotacija udesno) RCL Rotate carry left (rotacija sa prenosom ulevo) RCR Rotate carry right (rotacija sa prenosom udesno) SHLD Double-precision shift left SHRD Double-precision shift right 9.1.1 Logičko i aritmetičko pomeranje Postoje dva načina za pomeranje bitova unutar operanda. Logičko pomeranje upisuje nule na novokreirane pozicije. Na sledećoj slici, bajt se logički pomera za jednu poziciju udesno. Drugim rečima, svaki bit se pomera na sledeću nižu poziciju. Bitu 7 se dodeljuje vrednost 0. Sledeća ilustracija prikazuje jedno logičko pomeranje udesno binarne vrednosti 11001111, čime se dobija 01100111. Bit najmanje težine se premešta u Carry fleg:
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
9.
CELOBROJNA ARITMETIKA
9.1 Instrukcije pomeranja i rotacije
Instrukcije pomeranja su jedna od glavnih karakteristika asemblerskog jezika. Pomeranje
označava pomeranje bitova levo ili desno unutar operanda. U tabeli 1 su prikazane instrukcije
pomeranja, koje sve utiču na Overflow i Carry flegove.
Tabela 1. Instrukcije pomeranja i rotacije
Mnemonik Opis
SHL Shift left (pomeraj ulevo)
SHR Shift right (pomeraj udesno)
SAL Shift arithmetic left (aritmetičko pomeranje ulevo)
SAR Shift arithmetic right (aritmetičko pomeranje udesno)
ROL Rotate left (rotacija ulevo)
ROR Rotate right (rotacija udesno)
RCL Rotate carry left (rotacija sa prenosom ulevo)
RCR Rotate carry right (rotacija sa prenosom udesno)
SHLD Double-precision shift left
SHRD Double-precision shift right
9.1.1 Logičko i aritmetičko pomeranje
Postoje dva načina za pomeranje bitova unutar operanda. Logičko pomeranje upisuje nule
na novokreirane pozicije. Na sledećoj slici, bajt se logički pomera za jednu poziciju udesno.
Drugim rečima, svaki bit se pomera na sledeću nižu poziciju. Bitu 7 se dodeljuje vrednost 0.
Sledeća ilustracija prikazuje jedno logičko pomeranje udesno binarne vrednosti
11001111, čime se dobija 01100111. Bit najmanje težine se premešta u Carry fleg:
2
Drugi tip pomeranja je aritmetičko pomeranje. Novokreirane pozicije se popunjavaju sa
kopijom originalnog bita znaka:
Na primer, binarna vrednost 11001111, ima 1 kao bit znaka. Kada se aritmetički pomeri
za jedan bit udesno, postaće 11100111:
9.1.2 Instrukcija SHL
Instrukcija SHL vrši logičko pomeranje ulevo odredišnog operanda, popunjavajući
najniži bit sa nulom. Bit najveće težine se premešta u Carry fleg, a bit koji je bio u Carry flegu
se odbacuje:
Ako pomerite ulevo za jedno mesto broj 11001111, dobija se 10011110:
Sintaksa SHL instrukcije je:
SHL odredište, broj
gde broj označava za koliko mesta se vrednost pomera ulevo.
Instrukcija dozvoljava sledeće tipove operanada:
SHL reg,imm8
SHL mem,imm8
SHL reg,CL
SHL mem,CL
Procesori x86 dozvoljavaju da imm8 bude bilo koji ceo broj od 0 do 255. Alternativno,
registar CL može sadržati broj pomeranja. Ovi formati važe i za SHR, SAL, SAR, ROR, ROL.
Primer
U sledećim instrukcijama, BL se pomera jedanput ulevo. Najviši bit se kopira u Carry
fleg, a najniži postaje 0:
3
mov bl,8Fh ; BL = 10001111b
shl bl,1 ; CF = 1, BL = 00011110b
Višestruko pomeranje
Kada se vrednost pomera ulevo više puta, Carry fleg sadrži poslednji bit koji je pomeren
sa MSB pozicije. U sledećem primeru, bit 7 ne završava u Carry flegu, jer ga zamenjuje bit 6
(nula):
mov al,10000000b
shl al,2 ; CF = 0, AL = 00000000b
Na sličan način, kada se vrednost pomera udesno više puta, Carry fleg sadrži poslednji
bit koji je bio pomeren sa LSB pozicije.
Bitsko množenje
SHL može da vrši množenje sa stepenima dvojke. Pomeranje nekog operanda ulevo za n
bitova daje proizvod tog operanda sa 2n. Na primer, pomeranje broja 5 ulevo za 1 bit, daje 10:
mov dl,5
shl dl,1
Ako se binarni broj 00001010 (decimalno 10) pomeri ulevo za dva mesta, dobija se 40
(10 x 22):
mov dl,10 ; pre: 00001010
shl dl,2 ; posle: 00101000
9.1.3 Instrukcija SHR
Ova instrukcija vrši logičko pomeranje udesno odredišnog operanda, menjajući najviši
bit sa nulom. Najniži bit se kopira u Carry fleg, a bit koji je pre toga bio u Carry flegu je
izgubljen:
SHR koristi isti format instrukcija kao SHL. U sledećem primeru, 0 iz najnižeg bita u AL
se kopira u Carry fleg, a najviši bit u AL postaje 0:
mov al,0D0h ; AL = 11010000b
shr al,1 ; AL = 01101000b, CF = 0
Višestruko pomeranje
U ovom slučaju, poslednji bit koji je bio na LSB poziciji se premešta u Carry fleg:
4
mov al,00000010b
shr al,2 ; AL = 00000000b, CF = 1
Bitsko deljenje
Logičkim pomeranjem neoznačenog operanda udesno za n bitova, dobija se količnik tog
operanda sa 2n. U sledećim iskazima, delimo 32 sa 2 i dobija se 16:
mov dl,32
shr dl,1
U sledećem primeru, 64 se deli sa 23:
mov al,01000000b ; AL = 64
shr al,3 ; deljenje sa 8, AL = 00001000b
Deljenje označenih brojeva pomoću pomeranja se dobija koristeći SAR instrukciju, zato
što ona čuva bit znaka.
9.1.4 Instrukcije SAL i SAR
SAL instrukcija radi isto kao i SHL instrukcija. SAL pomera svaki bit u odredišnom
operandu za određeni broj mesta ulevo. Najnižem bitu se dodeljuje 0. Najviši bit se premešta u
Carry fleg, a bit koji je već bio u Carry flegu se odbacuje:
Ako se broj 11001111 pomeri ulevo za jedan bit, postaje 10011110:
Instrukcija SAR vrši aritmetičko pomeranje udesno odredišnog operanda:
Operandi instrukcija SAL i SAR su isti kao i za SHL i SHR. Pomeranje se može ponavljati
veći broj puta, na osnovu drugog operanda u instrukciji:
SAR odredište, broj
Sledeći primer pokazuje kako SAR duplicira bit znaka. AL je negativan pre i posle
pomeranja udesno:
5
mov al,0F0h ; AL = 11110000b (-16)
sar al,1 ; AL = 11111000b (-8), CF = 0
Označeno deljenje
Možete podeliti označeni operand sa stepenom broja 2 koristeći SAR instrukciju. U
sledećem primeru, -128 se deli sa 23. Rezultat je -16:
mov dl,-128 ; DL = 10000000b
sar dl,3 ; DL = 11110000b
Proširivanje znakom registra AX u EAX
Pretpostavimo da AX sadrži označeni ceo broj i da želite da ga proširite znakom i smestite
u EAX. Najpre se EAX pomera 16 bitova ulevo, a potom se aritmetički pomera za 16 bitova
udesno:
mov ax,-128 ; EAX = ????FF80h
shl eax,16 ; EAX = FF800000h
sar eax,16 ; EAX = FFFFFF80h
9.1.5 Instrukcija ROL
Instrukcija ROL pomera svaki bit ulevo. Najviši bit se kopira u Carry fleg i na poziciju
najnižeg bita. Format instrukcije je isti kao i za SHL.
Rotacijom se ne gube bitovi. Bit sa jedne strane se rotiranjem pojavljuje na drugoj strani.
Primetite u sledećem primeru kako se najviši bit kopira i u Carry fleg i na poziciju 0:
mov al,40h ; AL = 01000000b
rol al,1 ; AL = 10000000b, CF = 0
rol al,1 ; AL = 00000001b, CF = 1
rol al,1 ; AL = 00000010b, CF = 0
Višestruke rotacije
Kada se koristi broj rotacija veći od 1, Carry fleg sadrži poslednji bit koji je izrotiran sa
MSB pozicije:
mov al,00100000b
rol al,3 ; CF = 1, AL = 00000001b
Zamena grupe bitova
Instrukcija ROL se može koristiti za zamenu gornje (bitovi 4-7) i donje (bitovi 0-3)
polovine bajta. Na primer, rotiranjem broja 26h za četiri mesta u bilo kom smeru, dobija se 62h:
mov al,26h
6
rol al,4 ; AL = 62h
Kada se rotira ceo broj od više bajtova za 4 bita, dobija se pomeranje svake
heksadecimalne cifre za jednu poziciju ulevo ili udesno. Na primer, ovde je neprekidno rotiran
broj 6A4Bh ulevo za 4 bita, a na kraju je dobijena originalna vrednost:
mov ax,6A4Bh
rol ax,4 ; AX = A4B6h
rol ax,4 ; AX = 4B6Ah
rol ax,4 ; AX = B6A4h
rol ax,4 ; AX = 6A4Bh
9.1.6 Instrukcija ROR
Ova instrukcija pomera svaki bit udesno i kopira najniži bit u Carry fleg i bit najviše
pozicije. Format instrukcije je isti kao i za SHL:
U sledećim primerima, primetite kako se najniži bit kopira i u Carry fleg i u najviši bit
rezultata:
mov al,01h ; AL = 00000001b
ror al,1 ; AL = 10000000b, CF = 1
ror al,1 ; AL = 01000000b, CF = 0
Višestruka rotacija
Kada se koristi višestruka rotacija, Carry fleg sadrži poslednji bit koji je pomeren sa LSB
pozicije:
mov al,00000100b
ror al,3 ; AL = 10000000b, CF = 1
9.1.7 Instrukcije RCL i RCR
Instrukcija RCL pomera svaki bit ulevo, kopira Carry fleg u LSB i kopira MSB u Carry
fleg:
Ako posmatramo Carry fleg kao dodatni bit koji je dodat na krajnji bit operanda, RCL se
ponaša kao ROL instrukcija. U sledećem primeru, CLC instrukcija briše Carry fleg. Prva RCL
instrukcija premešta najviši bit iz BL u Carry fleg i pomera ostale bitove ulevo. Druga RCL
instrukcija premešta Carry fleg u najniži bit i pomera ostale bitove ulevo:
clc ; CF = 0
7
mov bl,88h ; CF,BL = 0 10001000b
rcl bl,1 ; CF,BL = 1 00010000b
rcl bl,1 ; CF,BL = 0 00100001b
Restauracija bita iz Carry flega
RCL može da vrati bit koji je prethodno bio premešten pomeranjem u Carry fleg. U
sledećem primeru se proverava najniži bit promenljive testval tako što se pomera njen najniži
bit u Carry fleg. Ako je najniži bit jednak 1, dolazi do skoka. U suprotnom, RCL vraća broj na
originalnu vrednost:
.data
testval BYTE 01101010b
.code
shr testval,1 ; pomeri LSB u Carry fleg
jc exit ; izađi ako je Carry fleg setovan
rcl testval,1 ; u suprotnom vrati broj na staro
Instrukcija RCR
Ova instrukcija pomera svaki bit udesno, kopira Carry fleg u MSB i kopira LSB u Carry
fleg:
Kao i u slučaju sa RCL, pomaže da se zamisli ceo broj na ovoj slici kao 9-bitna vrednost,
sa Carry flegom sa desne strane LSB-a.
U sledećem primeru se koristi STC kako bi se setovao Carry fleg. Potom se vrši RCR
operacija nad AH registrom:
stc ; CF = 1
mov ah,10h ; AH, CF = 00010000 1
rcr ah,1 ; AH, CF = 10001000 0
Prekoračenje označenih vrednosti
Overflow fleg se setuje kada se pomera ili rotira označeni ceo broj za jednu poziciju i
dobije se vrednost van opsega označenih brojeva odredišnog operanda. Drugim rečima, znak
broja biva promenjen. U sledećem primeru, pozitivan ceo broj (+127), smešten u 8-bitnom
registru, postaje negativan broj (-2) kada se rotira ulevo:
mov al,+127 ; AL = 01111111b
rol al,1 ; OF = 1, AL = 11111110b
Slično, kada se -128 rotira za jednu poziciju udesno, setuje se Overflow fleg. Rezultat u
AL (+64) ima suprotan znak:
8
mov al,-128 ; AL = 10000000b
shr al,1 ; OF = 1, AL = 01000000b
Vrednost Overflow flega je nedefinisana kada se pomera ili rotira za više od jednog mesta.
9.1.8 Instrukcije SHLD i SHRD
SHLD instrukcija pomera odredišni operand za određen broj mesta ulevo. Upražnjene
pozicije se popunjavaju sa najvišim bitovima izvorišnog operanda. Izvorišni operand se ne
menja, ali utiče se na Sign, Zero, Parity, Carry i Auxiliary Carry flegove:
SHLD odredište, izvorište, broj
Na sledećoj slici je prikazano izvršavanje SHLD instrukcije sa pomerajem od jednog
mesta. Najviši bit izvorišnog operanda se kopira u najniži bit odredišnog operanda. Svi bitovi
odredišnog operanda se pomeraju ulevo:
Instrukcija SHRD pomera odredišni operand za određeni broj pozicija udesno.
Upražnjene pozicije se popunjavaju najnižim bitovima izvorišnog operanda:
SHRD odredište, izvorište, broj
Na sledećoj slici je prikazao izvršavanje SHRD instrukcije sa pomerajem od jednog
mesta:
Sledeći formati instrukcija se mogu primeniti i na SHLD i SHRD. Odredišni operand
može biti registarski ili memorijski, a izvorišni operand mora biti registarski. Operand broj
može biti CL registar ili 8-bitni neposredni operand:
SHLD reg16,reg16,CL/imm8
SHLD mem16,reg16,CL/imm8
SHLD reg32,reg32,CL/imm8
9
SHLD mem32,reg32,CL/imm8
Primer 1
Sledeći iskazi pomeraju wval ulevo za 4 bita i ubacuju najviša 4 bita AX registra u najniže
4 pozicije wval promenljive:
.data
wval WORD 9BA6h
.code
mov ax,0AC36h
shld wval,ax,4 ; wval = BA6Ah
Kretanje podataka je prikazano na sledećoj slici:
Primer 2
U sledećem primeru, AX se pomera udesno za 4 bita, a najniža 4 bita registra DX se
pomeraju u najviše 4 pozicije registra AX:
mov ax,234Bh
mov dx,7654h
shrd ax,dx,4 ; AX = 4234h
SHLD i SHRD se mogu koristiti za manipulaciju bitmapiranim slikama, kada se grupa
bitova mora pomeriti ulevo ili udesno za pozicioniranje slike na ekranu. Druga moguća
upotreba je enkripcija podataka, u kojoj algoritam enkripcije uključuje pomeranje bitova. Na
kraju, dve instrukcije se mogu koristiti kada se vrši brzo deljenje i množenje sa veoma velikim
celim brojevima.
Sledeći primer demonstrira upotrebu SHRD tako što se niz dvostrukih reči pomera udesno