<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
11.4.13. Ciklusok
Assembly programozás tartalomjegyzék
Hátultesztelő ciklus
Elöltesztelő ciklus
Előre számláló léptető ciklus
Hátra számláló léptető ciklus
A ciklusok olyan programrészletek, amelyek többször egymás után végrehajtódnak; és az, hogy hányszor, egy bizonyos feltételtől függ.
Hátultesztelő ciklus:
Hátultesztelő ciklus esetében a ciklusmag (művelet végző utasítások) egyszer mindenképpen végrehajtódik, utána addig ismétlődik, amíg a kilépési feltétel meg nem valósul.
A hátultesztelő ciklust bemutató folyamatábra részlet:
Látható, hogy a hátultesztelő ciklus megvalósítható egyetlen feltételes elágazással, amelyet a ciklusmag után kell elhelyezni, és, amely a kilépési feltétel hiányában visszalép a ciklusmag elejére.
Egy hátultesztelő ciklust bemutató programrészlet, amely esetében a kilépési feltétel a ciklusmag műveleti eredményének túlcsordulása:
... ... UJRA ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége btfss STATUS,0 ;a túlcsordulás jelzőbit vizsgálata goto UJRA ;ha nincs túlcsordulás, visszalép ... ;túlcsorduláskor itt folytatódik ...
Elöltesztelő ciklus:
Elöltesztelő ciklus esetében a ciklus a kilépési feltétel tesztelésével kezdődik. Ha a kilépési feltétel már ilyenkor megvalósul, a ciklusmag (művelet végző utasítások) egyszer sem hajtódik végre.
Az elöltesztelő ciklust bemutató folyamatábra részlet:
Látható, hogy az elöltesztelő ciklus megvalósítható egyetlen feltételes elágazással, amelyet a ciklusmag elé kell elhelyezni, és, amely a kilépési feltétel teljesülésekor átugorja a ciklusmagot.
Egy elöltesztelő ciklust bemutató programrészlet, amely esetében a kilépési feltétel egy 8 bites túlcsordulás:
... ... TESZT btfsc STATUS,0 ;a túlcsordulás jelzőbit vizsgálata goto TOVABB ;túlcsorduláskor ugrik ... ;a ciklusmag kezdete ... goto TESZT ;a ciklusmag vége TOVABB ... ...
Előre számláló léptető ciklus:
A léptető ciklusok esetében a ciklus megkezdése előtt már ismert, hogy hányszor kell a ciklusmagot végrehajtani. Ez a szám vagy egy 8 bites konstans, vagy egy 8 bites műveleti eredmény; amelyet a ciklus számláló-regiszterébe kell másolni. (Itt csak a 8 bites számlálójú léptető ciklusokat tárgyaljuk.)
Az előre számláló léptető ciklus megvalósítására a legegyszerűbb megoldás az INCFSZ utasítás alkalmazása, amely eggyel növeli a ciklus számláló-regiszterét, majd megvizsgálja, hogy a regiszter értéke nullává vált-e, ami akkor következik be, amikor a 8 bites számláló-regiszter túlcsordul. Túlcsordulás esetén a ciklusmag végrehajtására többé már nem kerül sor, és a program az ezt követő műveletekkel folytatódik.
Egy hátultesztelő előre számláló léptető ciklust mutat be a következő programrészlet, amelynél a ciklusmag tízszer hajtódik végre:
... ... movlw 0xF6 ;W = 246d movwf SZAMLALO ;SZAMLALO = 246d UJRA ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége incfsz SZAMLALO ;SZAMLALO = SZAMLALO + 1; vizsgálat goto UJRA ;ha SZAMLALO nem nulla, visszalép ... ;ha SZAMLALO nulla, itt folytatódik ...
Egy elöltesztelő előre számláló léptető ciklust mutat be a következő programrészlet, ahol a ciklusmag szintén tízszer hajtódik végre:
... ... movlw 0xF5 ;W = 245d movwf SZAMLALO ;SZAMLALO = 245d UJRA incfsz SZAMLALO ;SZAMLALO = SZAMLALO + 1; vizsgálat goto CMAG ;ha SZAMLALO nem nulla, a ciklusmagra ugrik goto VEGE ;ha SZAMLALO nulla, vége a ciklusnak CMAG ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége goto UJRA ;vissza a ciklus elejére VEGE ... ...
A hátul-, illetve elöltesztelő ciklusok közötti fontos különbség a számláló-regiszter előzetes beállításának különbsége, amely a fenti példaprogramokból jól látható.
Továbbá megfigyelhető az is, hogy az azonos működésű hátultesztelő léptető ciklus megvalósítása egyszerűbb, így célszerű mindig ezt alkalmazni.
Természetesen a ciklusmagban a számláló-regiszter aktuális értéke műveletvégzésre (például közvetlen címzésre) is felhasználható.
A fent bemutatott egyszerű léptető ciklusok nem minden esetben felelnek meg az előforduló követelményeknek. Az előre számláló ciklusoknál célszerűbb, ha a számláló tetszőleges értékről indítható, és természetesen a ciklusmag végrehajtódásának száma is megadható.
Ez a feladat egy regiszter értékétől függő elágazással oldható meg. A ciklus megkezdése előtt a számláló értékét be kell tölteni. A kilépési feltétel a számláló bizonyos értéke lesz, amely vagy egy 8 bites konstans, vagy egy számított 8 bites regiszterérték. A számláló léptetését egy, a ciklusmagban elhelyezett, INCF utasítás végzi.
A következő programrészlet egy elöltesztelő előre számláló léptető ciklust mutat be, amely 1-től 10-ig számlál, vagyis a ciklusmag tízszer hajtódik végre.
... ... movlw 0x01 ;W = 1 movwf SZAMLALO ;SZAMLALO = 1; számláló kezdeti érték beállítása UJRA movlw 0x0B ;W = 11d; a kilépési érték betöltése ellenőrzéshez subwf SZAMLALO,0 ;W = SZAMLALO - 11d btfsc STATUS,2 ;a zérusjelző bit vizsgálata goto VEGE ;ha a zérusjelző bit "1", a ciklus végére ugrik ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége incf SZAMLALO,1 ;SZAMLALO = SZAMLALO + 1 goto UJRA ;vissza a ciklus elejére VEGE ... ...
Hátra számláló léptető ciklus:
A léptető ciklusok esetében a ciklus megkezdése előtt már ismert, hogy hányszor kell a ciklusmagot végrehajtani. Ez a szám vagy egy 8 bites konstans, vagy egy 8 bites műveleti eredmény; amelyet a ciklus számláló-regiszterébe kell másolni. (Itt csak a 8 bites számlálójú léptető ciklusokat tárgyaljuk.)
A hátra számláló léptető ciklus megvalósítására a legegyszerűbb megoldás a DECFSZ utasítás alkalmazása, amely eggyel csökkenti a ciklus számláló-regiszterét, majd megvizsgálja, hogy a regiszter értéke nullává vált-e. Nullázódás esetén a ciklusmag végrehajtására többé már nem kerül sor, és a program az ezt követő műveletekkel folytatódik.
Egy hátultesztelő hátra számláló léptető ciklust mutat be a következő programrészlet, amelynél a ciklusmag tízszer hajtódik végre:
... ... movlw 0x0A ;W = 10d movwf SZAMLALO ;SZAMLALO = 10d UJRA ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége decfsz SZAMLALO ;SZAMLALO = SZAMLALO - 1; vizsgálat goto UJRA ;ha SZAMLALO nem nulla, visszalép ... ;ha SZAMLALO nulla, itt folytatódik ...
Egy elöltesztelő hátra számláló léptető ciklust mutat be a következő programrészlet, ahol a ciklusmag szintén tízszer hajtódik végre:
... ... movlw 0x0B ;W = 11d movwf SZAMLALO ;SZAMLALO = 11d UJRA decfsz SZAMLALO ;SZAMLALO = SZAMLALO - 1; vizsgálat goto CMAG ;ha SZAMLALO nem nulla, a ciklusmagra ugrik goto VEGE ;ha SZAMLALO nulla, vége a ciklusnak CMAG ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége goto UJRA ;vissza a ciklus elejére VEGE ... ...
A hátul-, illetve elöltesztelő ciklusok közötti fontos különbség a számláló-regiszter előzetes beállításának különbsége, amely a fenti példaprogramokból jól látható.
Továbbá megfigyelhető az is, hogy az azonos működésű hátultesztelő léptető ciklus megvalósítása egyszerűbb, így célszerű mindig ezt alkalmazni.
Természetesen a ciklusmagban a számláló-regiszter aktuális értéke műveletvégzésre is felhasználható.
A fent bemutatott egyszerű léptető ciklusok nem minden esetben felelnek meg az előforduló követelményeknek. A hátra számláló ciklusoknál felmerülhet az igény, hogy a számláló tetszőleges értékről induljon, és természetesen a ciklusmag végrehajtódásának száma is megadható legyen. (Például egy 20-tól 11-ig számláló ciklus 10-szer végrehajtódó ciklusmaggal.)
Ez a feladat egy regiszter értékétől függő elágazással oldható meg. A ciklus megkezdése előtt a számláló értékét be kell tölteni. A kilépési feltétel a számláló bizonyos értéke lesz, amely vagy egy 8 bites konstans, vagy egy számított 8 bites regiszterérték. A számláló léptetését egy, a ciklusmagban elhelyezett, DECF utasítás végzi.
A következő programrészlet egy elöltesztelő hátra számláló léptető ciklust mutat be, amely 20-tól 11-ig számlál, vagyis a ciklusmag tízszer hajtódik végre.
... ... movlw 0x14 ;W = 20d movwf SZAMLALO ;SZAMLALO = 20d; számláló kezdeti érték beállítása UJRA movlw 0x0A ;W = 10d; a kilépési érték betöltése ellenőrzéshez subwf SZAMLALO,0 ;W = SZAMLALO - 10d btfsc STATUS,2 ;a zérusjelző bit vizsgálata goto VEGE ;ha a zérusjelző bit "1", a ciklus végére ugrik ... ;a ciklusmag kezdete ... ... ;a ciklusmag vége decf SZAMLALO,1 ;SZAMLALO = SZAMLALO - 1 goto UJRA ;vissza a ciklus elejére VEGE ... ...
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>