A processzorok számtalan jellemző tulajdonsága közül az alábbiakban a felhasználói, programozástechnikai szempontból leglényegesebb jellemzőkkel foglalkozunk. 2.1. A szervezés
Szervezés alatt a processzor által az aritmetikai és a logikai műveletek során egyidejűleg (párhuzamosan) feldolgozott bitek számát, a gépi szó hosszúságát értjük. A processzorhoz csatlakozó memória szervezésének, (az egy címen elérhető adat mennyiségének), valamint az adatbusz szélességének ezzel kompatibilisnek kell lennie. (Így tulajdonképpen inkább a számítógép szervezéséről beszélhetnénk.) Négy alapvető változat van: a bit-, a bájt-, a szó- és a kombinált szervezés. A bitszervezésnek inkább csak elvi jelentősége van. Szószervezésnél a gépi szó hosszúsága általában binárisan kerek szám (16 bit, 32 bit, stb.) A szószervezés igen gyakori speciális esete a bájtszervezés, ahol a gépi szó hosszúsága 8 bit. Nemrég még a folyamatirányítás területén az ilyen processzorok voltak a legelterjedtebbek. A kombinált szervezés azt jelenti, hogy a processzor bizonyos gépi utasítások végrehajtása során rövidebb, míg más utasításoknál hosszabb adatokkal dolgozik. A nagyobb adatelem hossza a rövidebbének általában binárisan kerek számú többszöröse. A kombinált szervezésnél memóriacímzéskor elérhető a teljes adat és annak önállóan címezhető részei is. Tipikus eset: 32 bites szó, 4 bájtra osztva. 2.2. Az adatábrázolás
Az adat a gépi szóban elhelyezkedő bitek sorozata, melynek önmagában jelentése nincs. Értelmezése, valamint a gépi szó esetleges struktúrálása a feldolgozó program feladata. (Ugyanaz a bitminta különböző programok számára különböző jelentéstartalmat hordoz.) Ilyen értelemben az adatábrázolás kötetlen, a gépi szóban bármi lehet. Vannak azonban olyan gépi utasítások, amelyek feltételezik a bitsorozat bizonyos struktúráltságát, vagyis értelmezik az adatot. Az ilyen utasítások (pl lebegőpontos aritmetikai műveletek) kötött adatformátumot igényelnek, vagyis a gépi szó bizonyos helyein adott értelmű adatelemnek kell lennie. Ellenkező esetben az utasítás végrehajtásakor hibás eredmény keletkezik. 2.3. A regiszterek
A regiszterek a processzorba integrált, gyors elérhetőségű belső tárolóelemek. A gyors elérhetőség abból adódik, hogy olvasásukkor vagy írásukkor nem kell időigényes buszciklust lebonyolítani. A regiszterek hossza általában megegyezik a gépi szó hosszúságával, de vannak ennél hosszabb és rövidebb regiszterek is. Léteznek un. általános célú, valamint un. speciális célú regiszterek. Az általános célú regiszterek tartalmát a processzor nem értelmezi tehát bennük úgymond’ bármi lehet, vagyis a programozó szabadon, akármilyen adat tárolására használhatja őket. Általános célú regiszterek nélkül elképzelhető ugyan processzor, de az olyan is, hiszen a regiszterek rendkívül hasznos programozástecnikai eszközök. Mondhatjuk, hogy egy processzor annál jobb, minél több univerzális regisztert tartalmaz. A speciális célú regiszterekkel más a helyzet. Ezek tartalmát a processzor meghatározott módon értelmezi, tehát nem mindegy, hogy mi van bennük. Az ilyen regiszterekhez a programozó csak speciális módon (meghatározott utasításokkal) férhet hozzá, egyesekhez pedig sehogy. Durva programhibák forrása lehet, ha nem az előírt módon és célra használjuk őket. Speciális célú regiszterek nélkül nem képzelhető el működőképes processzor, és minél komplexebb egy processzor, annál több ilyen regisztert tartalmaz. A speciális regisztereket két csoportba szokás sorolni, vannak un. adatregiszterek és vannak un. címregiszterek. (Az elnevezés nem túl szerencsés, mert a cím is tekinthető adatnak.) Az
adatregiszterek hossza megegyezik a gépi szó hosszával, a címregisztereké pedig a címével. (Az utóbbiak általában hosszabbak, pl. bájt-szervezésű processzornál a cím rendszerint két-bájtos.) Tipikus adatregiszterek: • Akkumulátor (AC): az aritmetikai egység központi regisztere, az aritmetikai és a logikai utasítások egyik (vagy egyetlen) operandusa. • Utasításregiszter (Instruction Register, IC): az éppen folyamatban lévő utasítás kódját tartalmazza. Tipikus címregiszterek: • Utasításszámláló (Program Counter, PC): a soron kövcetkező utasítás címét tartalmazza. • Stack-pointer (SP): a stack aktuálisan elérhető elemének (tetejének) a címét tartalmazza. • Indexregiszterek: tömbelem elérésekor a tömb báziscímét (vagy az elem indexét) tartalmazzák. • Szegmensregiszterek: szegmentált memória alkalmazása esetén az egyes memóriaszegmensek báziscímét tartalmazzák. Még egyéb speciális regiszterek is léteznek (az újabb processzorokban egyre több van); az érdeklődő Olvasó egy-egy konkrét processzor felhasználói kézikönyvét tanulmányozva bőven találhat még példákat.
Tevékenység:
A már említett források felhasználásával tanulmányozza az Intel 8080 processzor regisztereit! Természetesen más processzort is választhat, ha van róla megfelelő dokumentációja. -
-
1974/ 4.8 ezer tranzisztor/ 20 mm2 8 bit; 2,5 Mhz
Megjegyezzük, hogy az említettek közül alapvető jelentőségű és minden processzorban elengedhetetlen az akkumulátor, az utasításregiszter és az utasításszámláló megléte. A többi akkor szükséges, ha a processzor hardveresen támogatja a stack-kezelést, a tömb-ábrázolást, illetve a memóriát logikai szegmensekre osztva használja. (A mai processzorok mind ilyenek). Vannak még különleges, egybites speciális regiszterek, ezek a fizikailag egy-egy flip-floppal megvalósított un. jelzőbitek (flag-ek). Némelyikük az aritmetikai műveletek eredményének jellegzetes tulajdonságait (előjel, nullaság, átvitel) jelzi, mások a processzor üzemállapotaival kapcsolatos, fontos jelzéseket képviselik ( pl. megszakítás engedélyezve/tiltva, stb.). Általában az aritmetikai jelzőbitek képezik a programelágazásokat megvalósító feltételes vezérlésátadó utasítások döntési alapját. Nélkülük nem lehetne elágazó programot írni, ciklust szervezni, meglétük tehát elengedhetetlen.
2.4. Utasításkészlet, utasítástípusok
Felhasználói (programozói) szempontból az utasításkészlet a processzor legfontosabb jellemzője. Egy gépi utasítás egy - a processzor által közvetlenül elvégeztető - elemi művelet leírása. Az utasítások a gépi nyelv szókészletét alkotják, minden, a gép számára értelmes mondat (végrehajtható program) csak e szókészlet elemeivel fogalmazható meg. Minden gépi utasítás két kérdésre: a MIT? és a MIVEL? (vagy HOVÁ?) kérdésekre válaszol. A MIT? kérdésre az utasítás kódrésze, a gépi tevékenység leírása, a MIVEL? (HOVÁ?) kérdésre az operandusrész, a műveletben résztvevő adatok kijelölése válaszol. Az utasításkészlet a gép által közvetlenül elvégezhető műveletek összessége. Egy program végrehajtása gépi utasítások egymás utáni végrehajtását jelenti. A gépi működés alapegysége egy utasítás teljes végrehajtásának tartama. Ezt utasításciklusnak nevezzük. Egy utasítás végrehajtása során legalább egyszer, de - az utasítás jellegétől függően - gyakran többször is kapcsolatba kell lépni a memóriával, vagy egy periféria-regiszterrel (porttal). Az adatátvitel a rendszerbuszon zajlik le. Egy-egy ilyen átviteli folyamat egy kisebb egységet képvisel, ezt gépi ciklusnak, vagy buszciklusnak nevezzük. A buszművelet meghatározott szabályok szerint zajlik le és még kisebb egységekre tagolható. Ezzel elérkeztünk a gépi működés legkisebb egységéhez: az órajel-ciklushoz (vagy állapothoz). Ennél kisebb egység már nincs, hiszen a processzor egy szinkron sorrendi hálózat, és mint ilyen, minden állapotváltozása az órajel valamelyik éléhez kötődik. Tehát egy program végrehajtása: utasításciklusok sokaságának egymás utáni végrehajtása. Egy utasításciklus végrehajtása: néhány gépi ciklus végrehajtása. Egy gépi ciklus végrehajtása: néhány állapotváltozás lezajlása. A programozó az utasításciklusig lát el; a gépi ciklusokat már nem, az állapotokat pedig még kevésbé érzékeli. Ez azt jelenti, hogy a programozó az utasításciklusokat, azok egymásutánját előírhatja (ez maga a programozás), de a kisebb léptékű folyamatokra már nem lehet befolyása.
Tevékenység: Javasoljuk az Olvasónak, hogy a fentiekhez kapcsolódóan vegyen kézbe egy
konkrét processzor részletes felhasználói (vagy hardver) kézikönyvét és tanulmányozza az utasítás-végrehajtás mechanizmusát! Ajánljuk erre a célra az Intel 8080 processzort, amely ugyan ma már muzeális darab, de még sok van használatban, és sokáig ő képviselte az élvonalat. Különleges előnye, hogy nagy tudománya ellenére is rendkívül áttekinthető és egyszerű a felépítése és a működése. Az embernek az az érzése, mintha tervezésekor didaktikai szempontokat is érvényesítettek volna, és oktatási modelleszköznek (is) szánták volna. (Pedig biztos nem így volt…) A gépi utasításokról általánosságban nem túl sokat lehet mondani. Ahány processzor, annyiféle utasításkészlet van. Természetesen minden alapvető utasítást minden processzor megvalósít, de eltérő változatokban. Az általánosan jellemző utasítások funkcionális szempontból az alábbi csoportokba rendezhetők: • adatmozgató utasítások, • aritmetikai utasítások, • logikai utasítások, • forgató és toló utasítások, • vezérlésátadó utasítások és • egyéb utasítások. Az adatmozgató utasítások adatátalakítást nem végeznek, csak az adatok számítógépen belüli helyét jelölik ki, vagy változtatják meg. Szokás ezt a csoportot (a tipikus mnemonikus nevek
alapján) MOVE- vagy LOAD-csoportnak is nevezni. Statisztikailag a leggyakoribb utasítások, egy átlagos program utasításainak legalább a fele ilyen jellegű. Operandusaik regiszterek, memóriarekeszek, perifériális regiszterek lehetnek, gyakran tetszőleges párosításban. Szimbolikus formájuk: S→D, ami úgy értendő, hogy az S helyen (forrás) lévő adat átíródik a D helyre (cél). Ebbe a csoportba tartoznak olyan speciális utasítások is, mint a stackbe való írás (PUSH) vagy az onnan való olvasás (POP); ezek operandusa általában csak regiszter lehet. Az aritmetikai utasítások operandusaik között valamilyen aritmetikai műveletet végeznek. Általában az egyik operandusnak a művelet előtt az akkumulátorban kell lennie és az eredmény is ott keletkezik. A másik operandus rendszerint bárhol lehet (regiszter, memória). A régebbi processzorok aritmetikai készlete meglehetősen szegényes volt. Utasításszinten csak fixpontos összeadást és kettes komplemens képzést tudtak végezni. E műveletek felhasználásával persze bármilyen aritmetikai művelet megvalósítható, de csak viszonylag nagy és bonyolult programok segítségével, tehát nem közvetlenül, hanem szoftverrel. A mai processzorok már mind a négy alapműveletet elvégzik, sőt, lebegőpontos aritmetikával is rendelkeznek. Az aritmetikai csoport tipikus utasításai még a számláló utasítások (inkrementálás, dekrementálás), ezek operandusa regiszter lehet. A logikai utasítások operandusaik között logikai műveleteket végeznek. A művelet előtt itt is az egyik (vagy egyetlen) operandusnak az akkumulátorban kell lennie és az eredmény is ott keletkezik. Az operandusok teljes gépi szavak és a művelet a szó minden bitjére végrehajtódik. Utasítás-szintű szelektív bitkezelést általában nem valósítanak meg a processzorok, így az ilyen feladatokat több utasítással (programmal) lehet megoldani. A három logikai alapműveletet: az ÉS, a VAGY-kapcsolatot, valamint a negációt (komplementálás) minden processzor utasításkészlete tartalmazza. Ez azt jelenti, hogy a processzorok (természetesen) univerzális logikai műveletvégző eszközök, hiszen a három alapművelettel bármilyen logikai függvény megvalósítható. Ennek ellenére sok processzor utasításkészlete - redundáns módon - még egyéb logikai műveleteket is tartalmaz, ami persze a programozó szempontjából kényelmes. Szinte általános pl. a KIZÁRÓVAGY művelet megvalósítása. A forgató és a toló (rotate, shift) utasítások operandusa mindig az akkumulátor. Ezek az utasítások részben a szelektív bitkezelést segítik elő, részben az aritmetikai utasítások kiegészítői, mert jól használhatók szorzó, illetve osztó algoritmusok megvalósításában. A forgatás az akkumulátor tartalmának saját magában, vagy az átvitel-biten (carry flag) keresztüli, jobbra vagy balra történő, ciklikus eltolását jelenti. Az eltoláskor (shift) az akkumulátor tolásirányú szélső bitje eltűnik és az ellenkező oldalon zérus-bit kerül be. A vezérlésátadó utasítások rendkívül fontos és általában népes csoportot alkotnak. Ide tartoznak azok az utasítások, melyek segítségével program-elágazásokat lehet megvalósítani. Közös jellemzőjük, hogy az utasításszámláló (PC) tartalmát módosítják (ez jelenti a vezérlésátadást). Vannak ugró-típusú (JUMP-jellegű), szubrutinhívó (CALL-jellegű) és szubrutinból való visszatérést biztosító (RETURN-jellegű) vezérlésátadó utasítások. Rendszerint mindhárom típusnak vannak feltételes változatai, sőt, van olyan processzor, amely - szinte pazarló módon - mindhárom típus minden aritmetikai flag mindkét állapotára vonatkozó feltételes változatát megvalósítja (pl. JZ: ugorj, ha zéró, JNZ: ugorj, ha nem zéró, CP: szubrutinhívás, ha plusz, CM: szubrutinhívás, ha mínusz, stb.). Vannak azért takarékosabb processzorok is. Több esetben csak a JUMP-nak van feltételes változata, a CALL-nak és a RETURN-nek nincs. Létezik még egy érdekes, indirekt megoldás. Egyes processzorokban csak feltétel nélküli JUMP, CALL és RETURN van, viszont van feltételes utasításkihagyó utasítás (SKIP). Itt úgy lehet feltételes elágazást létrehozni, hogy a feltétel inverzét képviselő SKIP utasítással kihagyjuk, vagy sem a feltétlen vezérlésátadó utasítást.
Például: JZ most_nulla = SNZ, JUMP most_nulla, ahol JZ: ugorj, ha zéró, SNZ: hagyd ki, ha nem zéró. Az egyéb utasítások csoportja különösen processzorspecifikus, hiszen ide olyan különleges utasítások tartoznak, amelyek az adott processzor speciális működési jellemzőivel kapcsolatosak. Ide sorolhatjuk (ha vannak) a külön input/output utasításokat, a megszakítási rendszert engedélyező/tiltó utasításokat, a memóriaszegmenseket beállító utasításokat, stb. És ide tartozik a minden processzorban meglevő „ne csinálj semmit” utasítás (NOP) is. Ez a lázas semmittevés utasítása, mert a processzornak ezt a semmittevést izzadva végre kell hajtania.
Tevékenység: Újra javasoljuk az Olvasónak egy konkrét processzor gépkönyvének alapos
tanulmányozását! E nélkül ugyanis nem fogja eléggé megérteni és egyáltalán nem fogja megérezni egy processzor lüktető működését. Most az utasításkészletre koncentráljon! A gépi utasítások ismerete manapság nem azért szükséges, hogy gépi nyelven programozzunk, hanem azért, hogy megértsük a processzort. A magas szintű nyelvek steril csúcsairól mindebből semmi nem látszik. És ha nem is jár közvetlen haszonnal, az semmiképpen nem káros, ha valaki megért valamit. 2.5. A címzési módok
Az utasításokkal kapcsolatban korábban említett MIVEL? (HOVÁ?) kérdésre az operandusok kijelölése, a címzés ad választ. Az operandusokat különféleképpen adhatjuk meg, ennek lehetséges formái a címzési módok. 80x86 címzési módok A skálázott indexelt címzési mód
(www.inf.unideb.hu/~jvegh/edu/prog/AoAHLA/html/ch0 7s02.html)
Ha meggondoljuk, egy két-operandusú utasítás (pl. összeadás) végrehajtásához négy címet kellene megadni: a két operandus címét, az eredmény címét és a következő utasítás címét. Valóban, ez volt a helyzet az un. négycímű gépeknél. (Volt, mert ma már ilyenek nincsenek.) E gépek hallatlan előnye az volt, hogy a program egyes utasításait nem kellett sorban egymás után írni és a memóriába sem kellett sorban betölteni, hanem össze-vissza lehetett dobálni, hiszen minden utasítás tartalmazta a következő címét. Ha kikötjük, hogy a műveletvégzés előtt az egyik operandusnak már az aritmetikai egység adatregiszterében, az akkumulátorban kell lennie, akkor ennek megadása elmaradhat (háromcímű gép). Ha azt is kikötjük, hogy az eredmény is az akkumulátorban marad (hiszen úgyis ott keletkezik), akkor ezt sem kell megadni (kétcímű gép). Végül, ha bevezetünk egy speciális regisztert, amely nyilvántartja, hogy a program végrehajtása hol tart (vagyis kijelöli a következő utasítás címét), és amelyet a processzor az utasításciklus során automatikusan inkrementál (ez az utasításszámláló, a PC), akkor már csak egy operandust kell
megadni. Ez a jelenlegi, un. egycímű gép. Természetesen itt külön utasításokkal kell gondoskodni az egyik operandus akkumulátorba-töltéséről, illetve az eredmény áthelyezéséről. Az egyes processzorok által biztosított különböző címzési lehetőségeket a programozó nagyon jól kihasználhatja: növelheti az adatelhelyezés rugalmasságát, áttekinthetőségét, az adathalmaz strukturáltságát, javítva ezáltal a program hatékonyságát. A címzési módoknak különböző szempontok szerint több csoportja létezik. (Természetesen nem minden processzor biztosít minden lehetőséget.) A) Az operandus elhelyezésének szabadságfoka szerint • azonnali (immediate), • közvetlen (direct) és • közvetett (indirect) címzésről beszélünk. Az azonnali címzésnél az operandus értéke az utasítás része. Ez az érték a program írásakor rögzül és futáskor végig állandó marad. A direkt címzésnél az operandus memóriabeli helyét (az operandust tartalmazó memóriarekesz címét) adjuk meg. Futáskor az adat helye állandó marad, de értéke változhat. Az indirekt címzésnél egy pointert adunk meg, amely az adat helyére mutat, vagyis a cím címét határozzuk meg. Futáskor itt már nem csak az adat értéke, hanem helye is változhat. B) Attól függően, hogy a cím egészét, vagy csak egy részét adjuk meg, beszélünk abszolút, illetve relatív és indexelt címzésről. Az abszolút címzésnél az operandus teljes címét adjuk meg. A relatív és az indexelt címzés hasonló; mindkettőnél a címnek csak egy részét, egy báziscímhez képesti eltolást kell megadni. A teljes címet a processzor futás közben automatikusan generálja a báziscímből és az eltolás értékéből. Relatív címzésről akkor beszélünk, ha a báziscímet tartalmazó regiszter az utasításszámláló (PC), indexelt címzésről pedig akkor, ha a báziscím egy indexregiszter tartalma. Talán szükségtelen, mégis megjegyezzük, hogy működés közben a címbuszon mindig teljes címnek kell megjelennie. A fentiek csak arra vonatkoznak, hogy a teljes cím meghatározása egészében, vagy csak rézben a programozó feladata. C) Végül, ha az aktuális címet előállító regiszter tartalmát a processzor felhasználás előtt automatikusan eggyel csökkenti, vagy felhasználás után eggyel növeli, autodekrementáló, illetve autoinkrementáló címzésről beszélünk. E mód programozó általi előírása előnyösen használható pl. egy táblázat elemein való végiglépkedés során. A stackre vonatkozó műveletek is implicit autodekrementáló (PUSH) és autoinkrementáló (POP) címzési módot használnak. A fenti három szempont szerinti különböző csoportokba tartozó címzési módok a processzor által biztosított keretek között egy mással kombinálhatók. Így pl. beszélhetünk indirekt, indexelt címzésről, ahol az operandus címének a címe van megadva (indirekt), de ez a cím egy táblázat adott indexű eleme (indexelt).
Tevékenység: Tanulmányozza egy konkrét processzor által biztosított címzési lehetőségeket!
Kövesse végig az adatelérés folyamatát.!