Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
2.4.Operacjelogiczne
63
(abypętlamogłasięwykonywać,podczasdziałaniarozkazuLOOPE/LOOPZflagaZmusi
byćustawiona).Wceluokreślenia,zjakiegopowoduzakończonopętlę(czyzpowo-
duCX=0,czyZ=0),należysprawdzićstanflagiZ.InstrukcjaLOOPEjeststosowanaprzede
wszystkimdoposzukiwaniapierwszegoelementuwciągu,różniącegosięodzadanej
wartości.
Rozważmynastępującezadanie:dorejestruBLzapisaćnajmniejsząliczbęzprze-
działu[2,K],przezktórąniedzielisięzadanaliczbaN(załóżmy,żeKiNsąliczbami
orozmiarzebajtuorazże2<=K<N).Jeżelitakiejliczbyniema,todorejestruBLwpi-
saćliczbę0.WtymcelukolejnobędziemydzielićliczbęNprzez2,3,...,Kiporów-
nywaćresztęzdzieleniazzeremtakdługo,ażbędzieonaróżnaodzeralubzostaną
wyczerpanewszystkieliczbyzzadanegoprzedziału:
MOVDL,N
MOVDH,0
MOVCL,K
MOVCH,0
DECCX
MOVBL,1
petla:
INCBL
MOVAX,DX
DIVBL
CMPAH,0
LOOPEpetla
JNEkoniec
MOVBL,0
koniec:
;LiczbaNzapisanawDXjako16-bitowabezznaku
;Liczbapowtórzeńpętli
;Kolejnaliczbazprzedziału[2,K]
;WAHresztazdzielenia
;Czyreszta=0?
;Pętlawykonywanatakdługo,ażCX=0lubAH<>0
DziałanieinstrukcjiLOOPNE/LOOPNZmożnaprzedstawićnastępująco:
CX:=CX-1;IF(CX<>0)AND(Z=0)THENGOTO<etykieta>
Zakończenieiteracjinastępuje,gdyCX=0lubflagaZ=1.RozkazLOOPNEzwyklesto-
sujesięwceluposzukiwaniawciągupierwszegoelementumającegozadanąwartość.
Wrazzwprowadzeniemprocesora80386dolistyinstrukcjidodanodwienowemuta-
cjeinstrukcjiLOOP.Pierwsza,LOOPD(ang.LOOPDoubleword),wykorzystujejakolicz-
nikpętli32-bitowyrejestrECX,dlategomożnaznaczniezwiększyćliczbęwykonańpętli.
DrugainstrukcjaLOOPWnakazujeprocesorowiużycielicznikawpostacirejestruCX,gdy
programzostałskompilowanydowersji32-bitowej(w32-bitowejwersjistandardowo
instrukcjaLOOPwykorzystujerejestrECX).
2.4.Operacjelogiczne
Wtymrozdzialeprzedstawionoinstrukcjewykonująceoperacjelogicznenaposzczegól-
nychbitach.Dogrupytejzaliczonotakżeinstrukcjeprzesunięćiobrotów.Zawartotakże