Egyszerűsített lexikális elemző Feladata, hogy azonosító, szám, speciális jelek és a program vége jel előfordulásakor rendre A, 0, , és . karaktert írjon a képernyőre. Az esetleges hibákat ? jelezze. XLAT utasítás alkalmazásának tervezése: Karakter típusok karakterek kód Hibás karakter Betű A … Z a … z 2 Számjegy 0 … 9 4 Speciális jel , . ; + - ( ) cr lf 6 Vége jel $ 8 A44-47, fóliák: 28a-31 Máté: Architektúrák 5. előadás
data segment para public ’data’ ; ugró táblák a szintaktikus helyzetnek megfelelően: ; kezdetben, speciális és hibás karakter után t_s dw hiba ; hibás kar.: spec. jel szint dw lev_a ; betű: dw lev_n ; számjegy: dw lev_s ; spec. jel: dw vege ; szöveg vége: program vége 44-47 Máté: Architektúrák 5. előadás
t_a dw hiba ; hibás kar.: spec. jel szint dw OK ; betű: nincs teendő ; azonosító szint t_a dw hiba ; hibás kar.: spec. jel szint dw OK ; betű: nincs teendő dw OK ; számjegy: nincs teendő dw lev_s ; speciális jel: azonosító vége dw vege ; szöveg vége: program vége ; szám szint t_n dw hiba ; hibás kar.: spec. jel szint dw hiba ; betű: hiba: spec. jel szint dw lev_s ; speciális jel: szám vége level dw ? ; az aktuális ugrótábla címe 44-47 Máté: Architektúrák 5. előadás
c_h db 0 ; hibás karakter kódja c_b db 2 ; betű kódja c_n db 4 ; számjegy kódja c_s db 6 ; speciális jel kódja c_v db 8 ; végjel kódja specjel db ’ ,. ;+-()’, 13, 10 ; a speciális jelek vegjel db ’$’ ; vége jel, kihasználjuk, ; hogy itt van! table db 256 dup (?) ; átkódoló tábla (256 byte) text db ’a,tz.fea 21 a12 12a $’ ; elemzendő szöveg DATA ends 44-47 Máté: Architektúrák 5. előadás
code segment para public ’CODE’ assume cs:code, ds:data, es:data, ss:stack Lex proc far push ds xor ax,ax push ax ; visszatérési cím a veremben mov ax,data mov ds,ax mov es,ax ; assume miatt call prepare ; átkódoló tábla elkészítése mov si, offset text ; az elemzendő szöveg ; kezdőcíme call parsing ; elemzés ret ; vissza az Op. rendszerhez Lex endp 44-47 Máté: Architektúrák 5. előadás
prepare proc ; az átkódoló tábla elkészítése ; az eljárás rontja AX, BX, CX, DI, SI tartalmát cld ; a string műveletek iránya pozitív mov bx, offset table mov di,bx mov al,c_h ; hibás karakter kódja mov cx,256 ; a tábla hossza rep stos table ; table minden karakter hibás 44-47 Máté: Architektúrák 5. előadás
mov di,’A’ ; A ASCII kódja add di,bx ; A helyének offset címe mov al,c_b ; betű kódja mov di,’A’ ; A ASCII kódja add di,bx ; A helyének offset címe mov cx,’Z’-’A’+1 ; a nagybetűk száma ; a betűk ASCII kódja folyamatos! rep stosb mov di,’a’ ; a ASCII kódja add di,bx ; a helyének offset címe mov cx,’z’-’a’+1 ; a kisbetűk száma 44-47 Máté: Architektúrák 5. előadás
mov al,c_n ; számjegy kódja mov di,’0’ ; 0 ASCII kódja add di,bx ; 0 helyének offset címe mov cx,’9’-’0’+1 ; a számjegyek száma ; a számjegyek ASCII kódja folyamatos! rep stosb 44-47 Máté: Architektúrák 5. előadás
mov si,offset specjel ; speciális jelek ; feldolgozása xor ah,ah ; hogy ax=al legyen pr1: lods specjel ; speciális jel ASCII kódja mov di,ax ; ah=0 miatt ax = a jel kódja cmp al,vegjel ; vegjel közvetlenül a ; speciális jelek után! je pr2 ; ez már a vegjel mov al,c_s ; speciális karakter kódja mov [BX+DI],al ; elhelyezés a táblában loop pr1 ; ciklus vége 44-47 Máté: Architektúrák 5. előadás
pr2: mov al,c_v ; a végjel kódja mov [BX+DI],al ; elhelyezés a táblában ret ; vissza a hívó eljáráshoz prepare endp 44-47 Máté: Architektúrák 5. előadás
; az eljárás rontja AX, BX, CX, DI, SI tartalmát parsing proc ; elemzés ; az eljárás rontja AX, BX, CX, DI, SI tartalmát cld ; a string műveletek iránya pozitív mov bx, offset table mov di,offset t_s ; spec. jel szint lv1: mov level,di ; szint beállítás xor ah,ah ; hogy ax=al legyen OK: lods text ; a következő karakter XLAT ; AL 0, 2, 4, 6 vagy 8 MOV DI,LEVEL ; DI az akt. ugró ; tábla címe ADD DI,AX ; DI a megfelelő elem ; címe JMP [DI] ; kapcsoló utasítás 44-47 Máté: Architektúrák 5. előadás
hiba: mov di,offset t_s ; hibás karakter, ; spec. jel szint mov al,’?’ lv2: mov ah,14 ; BIOS hívás előkészítése int 10h ; BIOS hívás: ; karakter írás a képernyőre jmp lv1 lev_a: mov di,offset t_a ; azonosító kezdődik mov al,’A’ jmp lv2 44-47 Máté: Architektúrák 5. előadás
lev_n: mov di,offset t_n ; szám kezdődik mov al,’0’ jmp lv2 lev_s: mov di,offset t_s ; speciális jel mov al,’,’ vege: mov al,’.’ ; szöveg vége mov ah,14 ; BIOS hívás előkészítése int 10h ; BIOS hívás: ; karakter írás a képernyőre ret ; elemzés vége, vissza a hívóhoz parsing endp code ends 44-47 Máté: Architektúrák 5. előadás
stack segment para stack ’stack’ dw 100 dup (?) ; 100 word legyen a verem stack ends end Lex ; modul vége, start cím: Lex 44-47 Máté: Architektúrák 5. előadás
Mikroarchitektúra szint Feladata az ISA (Instruction Set Architecture) megvalósítása. Nincs rá általánosan elfogadott, egységes elv. Az ISA-szintű utasítások „függvények”, ezeket egy főprogram hívja meg végtelen ciklusban. A függvények a mikroarchitektúra szintjén valósulnak meg (mikroprogram). A mikroprogram változói (a regiszterek) definiálják a számítógép állapotát, pl.: PC (Program Counter, utasításszámláló). 224-225 Máté: Architektúrák 5. előadás
Az IJVM utasítások szerkezete: IJVM (Integer Java Virtual Machine): a JVM egész értékű aritmetikát tartalmazó része. Az IJVM utasítások szerkezete: az első mező az opcode (Operation Code, műveleti kód), az esetleges második mezőben az operandus meghatározására szolgáló adat van. Nem használjuk a C-ben írt SUN JVM interpretert, mert nem elég hatékony az elemi logikai áramkörök kezelésére. Mikroprogram: betölti, értelmezi és végrehajtja az IJVM utasításokat: betöltés-végrehajtás (fetch-execute) ciklus. 224-225 Máté: Architektúrák 5. előadás
Az ALU-nak (3.19-20. ábra) 6 vezérlő bemenete van: ENA az A bemenet engedélyése (1)/ tiltása (0), ENB a B bemenet engedélyése (1)/ tiltása (0), INVA: A#. (Ha ENA = 0, akkor 0# = FFFF = – 1), F0, F1. F0, F1 kiválasztja az AND, OR, B#, + művelet valamelyikét, INC: +1. 225-230 Máté: Architektúrák 5. előadás
Néhány példa (4.2. ábra átrendezve) A könyvben nem logikus, hibás. F0 F1 ENA ENB INVA INC Tevékenység 1 A AND B A OR B A B #A #B 225-230 Máté: Architektúrák 5. előadás
F0 F1 ENA ENB INVA INC Tevékenység 1 – 1 A + B A + B + 1 A + 1 B + 1 – 1 A + B A + B + 1 A + 1 B + 1 – A B – A B – 1 225-230 Máté: Architektúrák 5. előadás
Adatút (Data Path, 4.1. ábra) 32 bites regiszterek, sínek, ALU, léptető (SLL8 8 bittel balra, SRA1 1 bittel jobbra léptet). ALU bemenetei közül az egyik a H (Holding – tartó), a másik a B sín (9 lehetőség – vezérlőjelek: ). N 1, ha az eredmény < 0, különben 0, Z 1, ha az eredmény = 0, különben 0. Megfelelő időzítéssel egy cikluson belül lehetséges egy regiszterből olvasni és az eredményt akár ugyanoda visszaírni (vezérlőjelek: ) 4.3. ábra. 225-230 Máté: Architektúrák 5. előadás
Memóriaműveletek (4.1. ábra) Szócímzés (32 bites): adatszó írás, olvasás. MAR (Memory Address Register): szócím, MDR (Memory Data Register): szó. Szó címek transzformálása: 4.4. ábra. Bájtcímzés: ISA szintű utasítás bájt olvasás. PC (Program Counter): bájtcím, MBR (Memory Byte Register): bájt. MBR kétfajta értelmezése (két vezérlőjel): MBR: MBR előjelesen kerül a B sínre, MBRU: MBR előjel nélkül kerül a B sínre. 230-231 Máté: Architektúrák 5. előadás
Összesen 29 jel szükséges (4.1., 5-6. ábra): Az adatút vezérlése Összesen 29 jel szükséges (4.1., 5-6. ábra): 9 jel: a B sínre írás a regiszterekből, 8 jel: 6 az ALU és 2 a léptető vezérlésére, 9 jel: regiszterekbe írás a C sínről, 3 jel: a memória eléréshez (nem ábrázoltuk!) 2 jel: szó íráshoz/olvasáshoz 1 jel: bájt olvasáshoz. 232 Máté: Architektúrák 5. előadás
9 bit: a következő utasítás címének megadásához, Mikroutasítások 24 bit: az adatút vezérléséhez (a B sínre csak egy regiszter írhat egyszerre, ezért 9 helyett elég 4 bit), 9 bit: a következő utasítás címének megadásához, 3 bit: a következő utasítás kiválasztásának módjára. Ez adja a 36 bites mikroutasítást: 4.5. ábra. Mic-1: 4.6. ábra. 512x36 bites vezérlőtár, a mikroprogramnak, MPC (MicroProgram Counter): mikroprogram-utasításszámláló. MIR (MicroInstruction Register): mikroutasítás-regiszter. 232-235 Máté: Architektúrák 5. előadás
(MIR feltöltődik a vezérlőtár MPC által mutatott szavával.) Mic-1 működése: Adatút ciklus (4.6. ábra): (MIR feltöltődik a vezérlőtár MPC által mutatott szavával.) Kialakul a B sín kívánt tartalma, ALU és a léptető megtudja, mit kell csinálnia, Az ALU és a léptető elvégzi a feladatát, a C sín, N (Negative) és Z (Zero) megkapja az új értékét, A regiszterek feltöltődnek a C sínről. MBR/MDR megkapja az értékét, ha az előző ciklus adatot kért a memóriából. Kialakul MPC új értéke. Memória ciklus kezdete. 236 Máté: Architektúrák 5. előadás
Memória ciklus A memória ciklus az adatút végén kezdődik (MAR ill. PC feltöltése után), ezért ha a memória címet módosította ez a mikroutasítás, akkor a memória cím a módosított MAR ill. PC regiszter értéke lesz. Olvasásnál az eredmény csak két ciklussal később használható, mert MDR ill. MBR csak a következő adatút ciklus vége felé töltődik fel a memóriából, addig MDR ill. MBR régi értéke érhető el. 236 Máté: Architektúrák 5. előadás
A 9 bites következő cím (Addr) az MPC-be kerül. MPC új tartalma A 9 bites következő cím (Addr) az MPC-be kerül. JAMN/JAMZ esetén MPC legmagasabb bitjének és az N/Z bitnek logikai vagy kapcsolata képződik MPC legmagasabb helyértékén (elágazás). Pl.: esetén a következő utasítás Z –től függően a 0x92 vagy 0x192 címen található (feltételes ugrás – elágazás – a mikroprogramban). Cím Addr JAM Adatútvezérlő bitek 0x75 0x92 001 . . . JAMZ =1 236-239 Máté: Architektúrák 5. előadás
MPC új tartalma (folytatás) JMPC esetén MPC 8 alacsonyabb helyértékű bitjének és MBR 8 bitjének bitenkénti vagy kapcsolata képződik MPC-ben az adatút ciklus vége felé (MBR megérkezése után). Ilyenkor Addr 8 alacsonyabb helyértékű bitje általában 0 (feltétlen ugrás az MBR –ben tárolt címre – kapcsoló utasítás). Kezdődhet az újabb mikroutasítás végrehajtása. 236-239 Máté: Architektúrák 5. előadás
regiszter B sín, Addr MPC ALU, léptető megtudja, Mic-1 működése (MPC) MIR regiszter B sín, Addr MPC ALU, léptető megtudja, mit kell csináljon, eredmény C, N, Z C regiszterekbe JAMN, JAMZ (N, Z) mem. MDR és/vagy alapján módosul MPC mem. MBR JMPC (MBR) Memória ciklus indítása (rd, wr, fetch). 234-239 Máté: Architektúrák 5. előadás
Eljárás: paraméterek, munka terület. Rekurzív (önmagát hívó) eljárás, pl.: 0! = 1, ha n>0, akkor n! = n*(n-1)! A hívó és hívott eljárás paraméterei, változói nem lehetnek azonos területen: lokális változók. Verem (stack): LV (Local Variable), SP (Stack Pointer) verem mutató (4.8. ábra). A verem operandusok és az eredmény tárolására is használható, pl. (4.9. ábra): a1 = a2 + a3 239-241 Máté: Architektúrák 5. előadás
Az IJVM memóriamodellje A 4 GB memória, 1 G szóként is szervezhető. Funkcionális részei: 4.10. ábra. CPP (Constant Pool Pointer): terület a konstansok, mutatók tárolása; tartalma a program betöltésekor alakul ki, ISA utasítások nem írhatják felül. LV (Local Variable frame): lokális változók területe Operandusverem: a lokális változók területe fölött, Metódus terület: itt van a program. PC bájtot címez a metódus területen belül. IJVM utasításkészlet: 4.11. ábra. 241-247 Máté: Architektúrák 5. előadás
Java (C) IJVM program 4.11., 15. ábra Bin. kód program 1 ILOAD j // i = j + k 15 02 2 ILOAD k 15 03 i = j + k; 3 IADD 60 if(i = = 3) 4 ISTORE i 36 01 k = 0; 5 ILOAD i // if(i = = 3) 15 01 else 6 BIPUSH 3 10 03 j = j – 1; 7 IF_ICMPEQ L1 9F 00 0D 8 ILOAD j // j = j – 1 15 02 9 BIPUSH 1 10 01 10 ISUB 64 11 ISTORE j 36 02 12 GOTO L2 A7 00 0F 13 L1: BIPUSH 0 // k = 0 10 00 14 ISTORE k 36 03 15 L2: 247-248, 4.14. ábra Máté: Architektúrák 5. előadás
Mic-1 megvalósítása (4.5, 6. ábra) 36 bites bináris utasításokat kellene megadnunk. Pl.: Egy ciklusban növeljük SP-t 1-gyel és olvasást kezdeményezünk a memóriából, folytatás a 122-es utasításnál. Szimbolikusan ilyesmi: ReadRegister = SP, ALU = INC, Write SP, Read, NextAddress = 122; Nehézkes, helyette: SP = SP + 1; rd A folytatás címet csak akkor tüntetjük fel, ha az nem a következőként írt mikroutasítás (pl. goto Main1). 248-249 Máté: Architektúrák 5. előadás
MAL (Micro Assembly Language, 4.5-6. ábra) SOURCE: a B sínre kötött regiszterek bármelyike (MDR, PC, MBR, MBRU, SP, LV, CPP, TOS, OPC). MBRU az előjel nélküli (Unsigned) MBR. DEST: a C sínre kapcsolt regiszterek bármelyike (MAR, MDR, PC, SP, LV, CPP, TOS, OPC, H). Több regiszter is kaphatja ugyanazt az értéket. wr: memóriába írás MDR-ből a MAR címre. rd: memóriából olvasás MDR-be a MAR címről. fetch: 8 bites utasításkód betöltése MBR-be a PC címről. Megengedett műveletek: 4.16. ábra 249-253 Máté: Architektúrák 5. előadás
Nem megengedett pl. az alábbi utasítás pár: MAR = SP; rd MDR = H // A memóriából is most kapna értéket! Feltételes elágazás, pl.: Z = TOS ; if (Z) goto L1; else goto L2 // Z=1, ha TOS=0, különben Z=0. A címek különbsége 256 kell legyen (4.7. ábra)! TOS (Top Of Stack) A JMPC bit jelentése: goto (MBR OR value) Ilyenkor value általában 0 vagy 0x100. 250-253 Máté: Architektúrák 5. előadás
IJVM megvalósítása Mic-1-en (4.11., 17. ábra) Előkészület a gép indításakor: PC a végrehajtandó utasítás címét, MBR magát az utasítást tartalmazza. A legelső végrehajtandó mikroutasítás a Main1, ez: PC=PC+1; fetch; goto(MBR); PC most a végrehajtandó utasítás utáni bájtra mutat, ez lehet egy újabb utasítás kódja, vagy operandus. PC új értékének kialakulása után indul a fetch-csel kezdeményezett memória ciklus, ez a következő mikroutasítás végére MBR-be olvassa a program következő bájtját. goto (MBR) elugrik az utasítás feldolgozásához. 253-260 Máté: Architektúrák 5. előadás
Minden utasítás feldolgozását végző függvény első mikroutasítása az utasítás kódnak megfelelő címen van a mikroprogram tárban. Ez az oka, hogy nem helyezhetjük egymás után az egyes utasítások feldolgozását végző mikroutasítás sorozatot, ezért inkább azt a megoldást választottuk, hogy minden mikroutasítás tartalmazza a következő címét. Ha az első utasítás pl. NOP (No OPeration, nem csinál semmit), ennek a kódja 0x00, ezért a 0x00 címen kezdődik a NOP feldolgozását végző függvény. Ez egyetlen goto Main1 mikroutasítás. 253-260 Máté: Architektúrák 5. előadás
IJVM megvalósítása Mic-1-en (4.11., 17. ábra) A főciklus a Main1-nél kezdődik; PC a végrehajtandó utasítás címét, MBR magát az utasítást tartalmazza. Main1 a következő utasítást vagy adatbájtot olvassa. Címke Műveletek // kommentár Main1 PC = PC + 1; fetch; goto(MBR) nop1 goto Main1 iadd1 MAR = SP = SP – 1; rd iadd2 H = TOS iadd3 MDR = TOS = MDR + H; wr; goto Main1 253-260 Máté: Architektúrák 5. előadás
Mi a lexikális elemző feladata? Feladatok Mi a lexikális elemző feladata? Milyen adatokat tartalmaz az ugró tábla? Hogy működik az XLAT utasítás? Az átkódoló tábla kialakításakor más módszert alkalmaztunk a nagy betűk kódjának beírásához, mint a speciális jelek kódjának beírásához. Miért? Milyen karakter eredményez hibát szám beolvasása közben? Hogyan kezeli a program a különböző szintaktikus helyzeteket? Máté: Architektúrák 5. előadás
Milyen részei vannak az egy bites ALU-nak? Feladatok Milyen részei vannak az egy bites ALU-nak? Milyen vezérlő bemenetei vannak az ALU-nak? Milyen vezérlő bemenetek esetén lesz 1 az eredmény? Milyen eredményt szolgáltat az F0=0, F1=1, ENA=0, ENB=0, INVA=1, INC=1 vezérlő bemenet? Mi az adatút? Milyen jelek szükségesek az adatút vezérléséhez? Milyen részei vannak a Mic-1 mikroutasításainak? Milyen részei vannak az adatút ciklusnak? Hogy alakul ki MPC új tartalma? Máté: Architektúrák 5. előadás
Ismertesse az IJVM memóriamodelljét! Feladatok Ismertesse az IJVM memóriamodelljét! Milyen utasításai vannak a Mic-1 gépnek? Milyen ugró utasításai vannak a Mic-1 gépnek? Milyen értékeket vehet föl a SOURCE operandus? Milyen értékeket vehet föl a DEST operandus? Mit jelent a wr? Mely utasítások tudnak olvasni a memóriából, és hogy működnek? Hogy lehet védekezni az ellen, hogy MDR egyszerre kapjon értéket a memóriából és a C sínről? Máté: Architektúrák 5. előadás