Vissza a főoldalra    Vissza a PIC főoldalra

<< 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:

Hátultesztelő ciklus

11.4.13-1. Ábra

      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
  ...    

Vissza a lap tetejére


      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:

Elöltesztelő ciklus

11.4.13-2. Ábra

      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 ...    
  ...    

Vissza a lap tetejére


      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 ...    
  ...    

      Látható, hogy a ciklus futása során a számláló a 11 értéket is felveszi, de ennek hatására a ciklus már befejeződik.

Vissza a lap tetejére


      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 ...    
  ...    

      Látható, hogy a ciklus futása során a számláló a 10 értéket is felveszi, de ennek hatására a ciklus már befejeződik.

  Tudomány és Technika (test@t-es-t.hu)


 

<< Előző oldal   Vissza a tartalomjegyzékhez   Vissza a lap tetejére   Következő oldal >>

Vissza a főoldalra    Vissza a PIC főoldalra