560 likes | 712 Views
Az ISA szint tervezési szempontjai Hosszú távú : később is jó legyen az architektúra, Rövid távú : addig is piacon kell maradni. Rövidebb utasítások : kevesebb helyet foglalnak el, gyorsabban betölt hetők. Hosszabb utasítások : több lehetséges műveleti kód, nagyobb memória címezhető.
E N D
Az ISA szint tervezési szempontjai • Hosszú távú: később is jó legyen az architektúra, Rövid távú: addig is piacon kell maradni. • Rövidebb utasítások: kevesebb helyet foglalnak el, gyorsabban betölthetők. Hosszabb utasítások: több lehetséges műveleti kód, nagyobb memória címezhető. • Bájt címzés: hatékonyabb szöveg feldolgozásnál, Szó címzés: nagyobb memória címezhető. • … 11. előadás
Utasításformák, utasításhossz (5.9-10. ábra). 11. előadás
A műveleti kód kiterjesztése kbites műveleti kód esetén 2k különböző utasítás lehet,n bites címrésznél 2n memória címezhető, és egyik csak a másik rovására növelhető (5.11. ábra). Lehetőségek: • fix utasításhossz: rövidebb kód mellett hosszabb operandus rész, • minimális átlagos utasításhossz: a gyakori kódok rövidek, a ritkán használtak hosszabbak. 11. előadás
A műveleti kód kiterjesztése (5.12. ábra) Az 1111 kódot nem használtuk ki 3 címes utasításnak (menekülő kód), és ez lehetővé teszi, hogy további – igaz, nem 3 címes – utasításokat adjunk meg.1111 1110 és 1111 1111 is menekülő kód. 11. előadás
A műveleti kód kiterjesztése 1111 1111 1111 is menekülő kód. 11. előadás
Orthogonalitási elv: Jó architektúrában a műveleti kódok és a címzési módszerek (majdnem) szabadon párosíthatók. Három címes elképzelés (5.24. ábra): 1. típus: aritmetikai utasítások. 2. típus: közvetlen adat megadás, index módú LOAD és STORE utasítás. 3. típus: elágazó, eljárás hívó utasítások, LOAD és STORE, ezek R0-t használnák. 11. előadás
Két címes elképzelés (5.25. ábra). A mód 3 bitje lehetővé teszi a közvetlen operandus, direkt, regiszter, regiszter indirekt, index és verem címzési módokat Két további mód bevezetésére is lehetőség van. 11. előadás
Pentium IIutasításformái (5.13. ábra) Több generáción keresztül kialakult architektúra. Csak egy operandus lehet memória cím. Prefix, escape (bővítésre), MOD, SIB (Scale Index Base) bájt bit bit bit Melyik operandus a forrás? bájt/szó 11. előadás
Címzési módok (5.26. ábra): nagyon szabálytalan. Baj: nem minden utasításban használható minden mód, nem minden regiszter használható minden módban (nincs EBP indirekt, ESP relatív címzés). 32 bites címzési módok: 11. előadás
bit SIB(5.27. ábra): jó, de megéri? Legyen i az EAX regiszterben SIB módú hivatkozás:M[4*EAX+EBP+8] Verem keret 11. előadás
UltraSPARC (5.14. ábra) 32 bites egyszerű utasítások. Aritmetikai utasítások: 1 cél és 2 forrás regiszter vagy 1 cél, 1 forrás regiszter és 1 közvetlen konstans. LOAD, STORE (csak ezek használják a memóriát): a cím két regiszter összege vagy egy regiszter + 13 bites eltolás. Processzorokat szinkronizáló utasítás. 11. előadás
32 bites közvetlen adat megadása: SETHI – megad 22 bitet, a következő utasítás a maradék 10 bitet. 3 Az ugrások PC-relatívok, szót (4-gyel osztható bájt címet) címeznek. Jósláshoz 3 bitet elcsíptek. Az A bit az eltolás rést akadályozza meg bizonyos feltételek esetén. Eljárás hívás: 30 bites PC-relatív (szó) cím 11. előadás
JVM (5.15. ábra) Változó hosszúságú egyszerű utasítások, 8 kivételével mind 1, 2 vagy 3 típusú, a legtöbb 1 bájtos. Külön utasítások a kis indexű lokális változók betöltésére, kis konstansok verembe töltésére: ILOAD_1 ~ ILOAD 1 ~ WIDEILOAD 1 Címzési módok: közvetlen és index címzési mód 11. előadás
A további 8 utasítás szinte mind külön csoportot alkot. Ezekkel nem foglalkozunk részletesen. 11. előadás
Összefoglaló:5.28. ábra. A bonyolult címzési módok tömörebb programokat tesznek lehetővé, de nehezítik a párhuzamosítást. Ha a párosítás nem történhet szabadon, akkor jobb, ha csak egy választási lehetőség van (egyszerűbb hatékony fordítóprogramot írni). 11. előadás
Utasítástípusok • Adatmozgató (másoló) utasítások. • Diadikus: +, -, *, /, AND, OR, NOT, XOR, … • Monadikus: léptetés, forgatás, CLR, INC, NEG, … • Összehasonlítás, feltételes elágazás: Z, O, C, … • Eljáráshívás. Visszatérési cím: rögzített helyre (rossz) - az eljárás első szavába (jobb) - verembe (rekurzív eljárásokhoz is jó). • Ciklusszervezés (5.29. ábra): számláló • Input/output (5.30-32. ábra): - programozott I/O: tevékeny várakozás, 5.31. ábra - megszakítás vezérelt I/O - DMAI/O (5.32. ábra): cikluslopás 11. előadás
i=1; L1: első utasítás . . . utolsó utasítás i = i + 1; if(i ≤n) goto L1; Végfeltételes ismétlés i=1; L1: if(i > n) goto L2; első utasítás . . . utolsó utasítás i = i + 1; goto L1; L2: … Kezdő feltételes ismétlés Ciklusszervezés (5.29. ábra) 11. előadás
Feltételes végrehajtás(5.49-50. ábra): CMOVZ R2, R3, R1csak akkor hajtja végreR2 = R3-t , haR1= 0. 11. előadás
Predikáció, IA – 64 (5. 51. ábra) 64 predikátum regiszter: 1 bites regiszterek, többnyire párban. CMPEQ R2, R3, P4 beállítja P4-et és törli P5-öt, ha R2 = R3, különben P5-öt állítja be és P4-et törli. 11. előadás
A Pentium II utasításai • Egész utasítások legnagyobb része: 5.33. ábra. • Egyéb utasítások (pl. lebegőpontosak). Az UltraSPARC utasításai Összes egész utasítás: 5.34. ábra. A utasításnévben CC: beállítja a feltételkódot. Szimulált utasítások (5.35. ábra), pl.: MOV SRC,DST ≡ OR SRC,G0,DST A picoJava II utasításai (5.36. ábra) Típusoltság biztonsági okokból. I (int: 32), L (long: 64) F (float: 32) D (double: 64 bit) 11. előadás
Vezérlési folyamat Szekvenciális vezérlés: Az utasítások abban a sorrendben kerülnek végrehajtásra, ahogy a memóriában elhelyezkednek. Elágazás: 5.37. ábra. elágazás szekvenciális vezérlés program számláló idő 11. előadás
hívó eljárás hívott eljárás főprogram Eljárás (5.42. ábra): Az eljáráshívás úgy tekinthető, mint egy magasabb szinten definiált utasítás végrehajtása: elég, ha azt tudjuk, mit csinál az eljárás, nem lényeges, hogy hogyan. Rekurzív eljárás: önmagát közvetlenül vagy közvetve hívó eljárás. … … 11. előadás
Hanoi tornyai (5.38-40. ábra) Rekurzív eljárás, amely n korongot mozgat i-ről j-re: public void towers (int n, int i, int j) { int k; if(n==1) // System.out.println(”korong: ”+i+”->”+j”re”);System.out.println(”korong: ”+i+”->”+j); else { k=6-i-j; towers(n-1, i, k); towers(1, i, j); towers(n-1, k, j); } } 11. előadás
5.39-40. ábra 5.41. ábra Hívások:A verem tartalma az eljárásban: towers(3,1,3) 3, 1, 3, V, F, k towers(2,1,2) 3, 1, 3, V, F, 2, 2, 1, 2, V, F, k towers(1,1,3) 1 -> 3 3, 1, 3, V, F, 2, 2, 1, 2, V, F, 3, 1, 1, 3, V, F, k visszatérés után3, 1, 3, V, F, 2, 2, 1, 2, V, F, 3 towers(1,1,2) 1 -> 2 3, 1, 3, V, F, 2, 2, 1, 2, V, F, 3, 1, 1, 2, V, F, k towers(1,3,2) 3 -> 2 towers(1,1,3) 1 -> 3 V: visszatérési cím towers(2,2,3) F: régi FP towers(1,2,1) 2 -> 1 towers(1,2,3) 2 -> 3 towers(1,1,3) 1 -> 3 11. előadás
Rekurzív eljárások megvalósításához veremre van szükség. Minden hívás esetén az eljárás paramétereit a verembe kell tenni, és ott kell elhelyezni a lokális változókat is! Eljárásprológus: a régi verem keret mutató (FP) elmentése, új verem keret mutató megadása és a verem mutató (SP) növelése, hogy legyen hely a veremben a lokális változók számára. Eljárásepilógus: visszatéréskor a verem kitakarítása. 11. előadás
5.45. ábra: Pentium II program (~5.45. ábra). 5.46. ábra: UltraSPARC II program, eltolás rés! 5.47. ábra: JVM program, kb. jó, csak az angolról fordítás miatt az elejét módosítani kellett volna: ”Move disk from” i ”to” j ”Korong mozgatása” i ”-ről” j ”-re””Korong mozgatása” i ”->” j 11. előadás
B A főprogram Vezérlési folyamat • Szekvenciális vezérlés (5.37. ábra) • Elágazás. • Eljárás: 5.42. ábra. • Megszakítások. • Csapdák. • Korutinok: 5.43. ábra. Párhuzamos feldolgozás szimulálására alkalmas egy CPU-s gépen. … … korutinok goto helyett jobb a ciklus vagy az eljárás alkalmazása! 11. előadás
Assembler előre hivatkozási probléma 11. előadás
Megoldási lehetőség: Az assembler kétszer olvassa a program szövegét (két menet). Az első menet célja összegyűjteni, táblázatba foglalni a szimbólum definíciókat, így a második menet idején már minden (a programban definiált) szimbólum ismert, tehát a második menetben már nem jelentkezik az előre hivatkozási probléma. Valahogy megpróbálni a fordítást egy menetben. Késleltetni a fordítást ott, ahol előre hivatkozás van, pl. táblázatba tenni a még le nem fordított részeket. A menet végén már minden szimbólum ismert, ekkor feldolgozni a táblázatot. Esetleg minden szimbólum definíciót követően azonnal feldolgozni a szimbólumra vonatkozó korábbi hivatkozásokat. 11. előadás
Mindkét esetben szükség van szimbólum tábla készítésére, de az utóbbi megoldásban a még le nem fordított utasítások miatt is szükség van táblázatra. További nehézséget jelent, hogy nem sorban készülnek el a tárgy kód (object code) utasításai, ezért ezeket pl. listába kell helyezni, majd rendezni a listát, és csak ezután történhet meg az object és a lista file elkészítése. Manapság a legtöbb assembler két menetben működik. 11. előadás
Két menetes assembler, első menet Legfontosabb feladata a szimbólum tábla felépítése. A szimbólum tábla: érték: – címke címe, – változó címe, – szimbolikus konstans értéke. 11. előadás
egyéb információk: – típus, – méret, – szegmens neve, amelyben a szimbólum definiálva van, – relokációs flag, – . . . 11. előadás
Literál: pl. az IBM 370-esgépcsaládon: L 14,=F’5’ ;Load register 14 az 5-ös ;Full Word konstanssal Többek között a literálok gyakori használata vezetett a közvetlen operandus megadás kialakulásához és elterjedéséhez. 11. előadás
Egy lehetséges operációs kód tábla részlete: 11. előadás
procedure ElsőMenet;1. menet, vázlat const méret = 8; EndUtasítás = 99; var HelySzámláló, osztály, hossz, kód: integer; VanInput: boolean; szimbólum, literál, mnemo:array[1..méret] of char; sor: array[1..80] of char; begin Előkészítés; TáblákIinicializálása; HelySzámláló := 0; VanInput = true; 11. előadás
while VanInput do begin sorok feldolgozása SorOlvasás(sor); Megőrzés(sor); if NemKomment(sor) then begin nem kommentár SzimbólumDef(sor, szimbólum); if szimbólum[1] ’ ’ thenszimbólum definíció ÚjSzimbólum(sor,szimbólum, HelySzámláló); LiterálKeresés(sor, literál); if literál[1] ’ ’ then ÚjLiterál(literál); hossz := 0; OpKódKeresés(sor, mnemo); OpKódTáblában(sor, mnemo, osztály, kód); 11. előadás
if osztály 0 then nem létező utasítás PszeudoTáblában(sor,mnemo, osztály, kód); if osztály 0 then HibásOpKód; hossz := típus(osztály); utasítás hossza HelySzámláló := HelySzámláló + hossz; if osztály = EndUtasítás then begin VanInput := false; LiterálTáblaRendezés; DuplikátumokKiszűrése; Lezárások; end; {if osztály = } end;nem kommentár end; while VanInput end; 1. menet 11. előadás
OpKódKeresés eljárás triviális, mindössze az a feladata, hogy a sor-ban az első szóköz után a látható karaktereket a következő szóközig terjedően mnemo-ba másolja. OpKódTáblában eljárás meglehetősen bonyolult, az operandusok elemzésével kell megállapítania, hogy az utasítás melyik osztály-ba tartozik. Látszólag feleslegesen határozza meg a kód-ot, de a többi feladata mellett ez már nagyon egyszerű, és így ez a függvény a második menetben változtatás nélkül alkalmazható. Az OpKódTáblában eljárás nem alkalmas pl. az ORG pszeudo utasítás feldolgozására! Nem ismeri a HelySzámláló-t. ASorOlvasás(sor); Megőrzés(sor);arra utal, hogy a második menetben olvashatjuk az első menet eredményét. Pl. az első menet folyamán szokás elvégezni az INCLUDE utasításokhoz, a makró definíciókhoz és makró hívásokhoz tartozó feladatokat. 11. előadás
Az Előkészítés valami ilyesmi lehet: Push(NIL); sehova mutató pointer a verembe InputFileNyitás; p = ProgramSzövegKezdete; ... A továbbiak soránp mutatja a következő feldolgozandó karaktert. ASorOlvasáseljárás: begin while p = EOF do begin Pop(p); if p = NIL then ENDHiba;nincs END utasítás end; EgySorOlvasás(sor); end; 11. előadás
Hasortörténetesen INCLUDE utasítás, akkor az EgySorOlvasáseljárás ezt a következőképpen dolgozhatja fel: Push(p); IncludeFileNyitás; p = IncludeSzövegKezdete; 11. előadás
procedure MásodikMenet;2. menet, vázlat const méret = 8; EndUtasítás = 99; var HelySzámláló, osztály, hossz, kód: integer; VanInput: boolean; szimbólum, mnemo:array[1..méret] of char; sor: array[1..80] of char; operandusok[1..3] of integer;op1, op2, címzési mód byte object: [1..10] of byte; begin Előkészítés2; {nincs TáblákIinicializálása;} HelySzámláló := 0; VanInput = true; 11. előadás
while VanInput do begin sorok feldolgozása SorOlvasás2(sor); {nincs Megőrzés(sor);} if NemKomment(sor) then begin nem kommentár SzimbólumDef(sor, szimbólum); if szimbólum[1] ’ ’ then szimbólum definíció SzimbólumEllenőrzés (sor, szimbólum, HelySzámláló); {nincs LiterálKeresés(sor, literál); hossz := 0; OpKódKeresés(sor, mnemo); OpKódTáblában(sor, mnemo, osztály, kód); 11. előadás
if osztály 0 then nem létező utasítás PszeudoTáblában(sor,mnemo, osztály, kód); if osztály 0 then HibásOpKód2; Most készül a lista! case osztály of 0: hossz := fordít0(sor, operandusok); 1: hossz := fordít1(sor, operandusok); ... end; Összeállítás(kód, osztály, operandusok, object); ObjectKiírás(object); Listázás(HelySzámláló, object, sor); HelySzámláló := HelySzámláló + hossz; 11. előadás
if osztály = EndUtasítás then begin VanInput := false; {nincs LiterálTáblaRendezés; DuplikátumokKiszűrése;} Lezárások2; end; {if osztály = } end;nem kommentár end;while VanInput end; 2. menet 11. előadás
Összeállítás = assemble Az assembler számos hibát ismerhet fel: • használt szimbólum nincs definiálva, • egy szimbólum többször van definiálva, • nem létező operációs kód, • nincs elegendő operandus, • túl sok operandus van, • hibás kifejezés (pl. 9 egy oktális számban), • illegális regiszter használat, • típus hiba, • nincs END utasítás, • . . . 11. előadás
Számos olyan hibát azonban, melyet a magasabb szintű nyelvek fordítói könnyen felismernek – vagy egyáltalán elő se fordulhatnak – az assembler nem tud felderíteni: • az eljárás hívás paramétereinek típusa nem megfelelő, • a regiszter mentések és helyreállítások nem állnak „párban”, • hibás vagy hiányzik a paraméter vagy a lokális változó terület ürítése a veremből, • a hívás és a hívott eljárás helyén érvényes ASSUME-ok ellentmondásosak (nem feltétlenül hiba, de az lehet), • . . . 11. előadás
Az object file nemcsak a lefordított utasításokat tartalmazza, hanem további – a szerkesztőnek szóló – információt is. 11. előadás
Makró generátor Feladata a makró definíciók megjegyzése (pl. makró táblába helyezése) és a makró hívások kifejtése. Általában az assembler első menetében működik. Makró definíciók felismerése Amennyiben az assembler a forrás szöveg olvasása közben makró definíciót talál (ezt könnyű felismerni a műveleti kód részen lévő MACRO szó alapján), akkor a makró definíció teljes szövegét – az ENDM műveleti kódot tartalmazó sor végéig – elhelyezi a makró táblában. A felismerést és a tárolást a SorOlvasás vagy a PszeudoTáblában eljárás végezheti. 11. előadás
Makró hívások kifejtése Az OpKódTáblában(sor,mnemo, osztály, kód); if osztály 0 then nem létező utasítás PszeudoTáblában(sor, mnemo, osztály, kód); programrész után be kell szúrni az if osztály 0 then MakróTáblában(sor, mnemo, osztály, kód); sorokat. A eljárás feladata a makró hívás felismerése és a makró helyettesítés is. A kifejtett makró egy pufferbe kerül, a puffer tartalma az INCLUDE utasításnál látottakhoz hasonlóan illeszthető a program szövegébe. 11. előadás
A makró kifejtés egy ciklikusban: EgySzóOlvasásaAMakróTörzsből; if FormálisParaméter then AMegfelelőAktuálisParaméterÁtmásolása; else ASzóÁtmásolása; ElválasztójelFeldolgozása; Az ElválasztójelFeldolgozása legtöbbször az elválasztójel másolását jelenti, de a makró definícióban különleges szerepet játszó karakterek esetén ettől eltérő – magától értetődő – speciális feladatot kell végrehajtani. 11. előadás