740 likes | 858 Views
String kezelő utasítások Az s forrás területet ( DS:SI ), a d cél területet pedig ( ES:DI ) címzi. A mnemonik végződése ( B / W ) vagy az operandus jelzi, hogy bájtos vagy szavas a művelet.
E N D
String kezelő utasítások Az s forrás területet(DS:SI), a d cél területet pedig (ES:DI)címzi. A mnemonik végződése (B / W) vagy az operandus jelzi, hogy bájtos vagy szavas a művelet. A címzésben résztvevő indexregiszterek értéke 1-gyel módosul bájtos, 2-vel szavas művelet esetén. Ha a D (Direction)flag értéke 0, akkor az indexregiszterek értéke növekszik, 1, akkor csökken. CLD ; D 0 STD ; D 1 5. előadás
Az alábbi utasítások – mint általában az adat mozgató utasítások – érintetlenül hagyják a flag-eket Átvitel az (ES:DI) által mutatott címre a (DS:SI) által mutatott címről: MOVSB ; MOVe String Byte MOVSW ; MOVe String Word MOVS d,s ; MOVe String (byte vagy word) d és s csak azt mondja meg, hogy bájtos vagy szavas az átvitel! 5. előadás
Betöltés AL-be illetve AX-be a (DS:SI) által mutatott címről (csak SI módosul): LODSB ; LOaD String Byte LODSW ; LOaD String Word LODS s ; LOaD String (byte vagy word) Tárolás az (ES:DI) által mutatott címre AL-ből illetve AX-ből (csak DI módosul): STOSB ; STOre String Byte STOSW ; STOre String Word STOS d ; STOre String (byte vagy word) 5. előadás
Az alábbi utasítások beállítják a flag-eket Az (ES:DI) és a (DS:SI) által mutatott címen lévő byte illetve szó összehasonlítása, a flag-ek s – d (!!!) értékének megfelelően állnak be. CMPSB ; CoMPare String Byte CMPSW ; CoMPare String Word CMPS d,s ; CoMPare String (byte vagy word) Az (ES:DI) által mutatott címen lévő byte (word) összehasonlítása AL-lel (AX-szel), a flag-ek AL – d illetve AX – d(!!!) értékének megfelelően állnak be. SCASB ; SCAn String Byte SCASW ; SCAn String Word SCAS d ; SCAn String (byte vagy word) 5. előadás
Ismétlő prefixumok REP REPZ REPE és REPNZ REPNE A Z, E, NZ és NE végződésnek hasonló szerepe van, mint a LOOP utasítás esetén. Ismétlő prefixum használata esetén a string kezelő utasítás CX-szer kerül(het) végrehajtásra: • ha CX = 0, akkor egyszer sem (!!!), • különben minden végrehajtást követően 1-gyelcsökken a CX regiszter tartalma. Amennyiben CX csökkentett értéke 0, akkor nem történik további ismétlés. A flag beállító string kezelő utasítás ismétlésének további feltétele, hogy a flag állapota megegyezzen a prefixum végződésében előírttal. 5. előadás
Ismétlő prefixumok REP REPZ REPE és REPNZ REPNE A program jobb olvashatósága érdekében • flag-et nem állító utasítások előtt mindigREP-ethasználjunk, • flag-et beállító utasítás előtt pedigsohaseREP-et, hanemhelyette a vele egyenértékűREPE-tvagy REPZ-t! 5. előadás
; A 100 elemű array nevű tömbnek van-e ; 3-tól különböző eleme? mov cx, 100 mov di, -1 ; előbb lehessen inc, mint cmp mov al, 3 NEXT: inc di cmp array[di], al ; array di-edik eleme = 3? LOOPE NEXT ; ugrás NEXT-re, ; ha CX0 és a di-edik elem=3 JNE NEM3 ; CX = 0 vagy array[di] 3 . . . ; array 3 . . . NEM3: . . . ; di az első 3-tól különböző . . . ; elem indexe 5. előadás
Ugyanennek a feladatnak a megoldása string kezelő utasítás segítségével: ; A 100 elemű array nevű tömbnek van-e ; 3-tól különböző eleme? mov cx,100 mov di,offset array mov AL,3 REPE SCAS array ; array 0., 1., ... eleme = 3? JNE NEM3 . . . ; array 3, . . . NEM3: DEC DI ; DI az első 3 elemre mutat . . . 5. előadás
mov cx,100 mov di,offset array mov AL,3 REPE SCAS array JNE NEM3 . . . . . . NEM3: DEC DI . . . Használja ES-t. Sokkal gyorsabb mov cx, 100 mov di, -1 mov al, 3 NEXT: inc di cmp array[di], al LOOPE NEXT JNE NEM3 . . . . . . NEM3: . . . . . . A 100 elemű array nevű tömbnek van-e 3-tól különböző eleme? Nem minden eltérés lényeges! 5. előadás
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: 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 ; következő karakter t_s dw hiba ; hibás kar.: ? spec. jel szint dw lev_a ; betű: A azonosító szint dw lev_n ; számjegy: 0 szám szint dw lev_s ; spec. jel: , spec. jel szint dw vege ; $: . program vége 5. előadás
; 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: , spec. jel szint dw vege ; $: . program vége ; szám szint t_n dw hiba ; hibás kar.: ? spec. jel szint dw hiba ; betű: hiba: ? spec. jel szint dw ok ; számjegy: nincs teendő dw lev_s ; speciális jel: , spec. jel szint dw vege ; $: . program vége 5. előadás
level dw ? ; az aktuális ugrótábla címe 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.fe&a 21 a12 12a $’ ; elemzendő szöveg data ends 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 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 5. előadás
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 rep stosb 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 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 van! 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 jmp pr1 ; ciklus vége 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 5. előadás
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. címe add di, ax ; az ugrótáblán belüli cím jmp [di] ; kapcsoló utasítás 5. előadás
hiba: mov di,offset t_s ; hibás karakter, ; spec. jel szint következik 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 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,’,’ jmp lv2 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 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 5. előadás
Mikroarchitektúra szint Feladata az ISA (Instruction Set Architecture – gépi utasítás szint) megvalósítása. Nincs rá általánosan elfogadott, egységes elv. A 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ó). 5. előadás
Mic-1 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:H (Holding – tartó), B sín. Egy cikluson belül lehetséges egy regiszterből olvasni és az eredményt akár ugyanoda visszaírni 4.3. ábra. memória MAR MDR PC MBR SP LV CPP TOS OPC H Memória vezérlő regiszterek Vezérlő jelek B sínre írja a regisztertC sínt a regiszterbe írja memóriábamemóriából Bsín Csín B A N 1, ha az eredmény < 0, különben 0, 6 Z 1, ha az eredmény = 0, különben 0. ALU ALUvezérlés 2 Léptető vezérlés Léptető 5. előadás
Pl. SP = SP + 1 • SPB sín • ALU: B+1 C • C SP memória MAR MDR PC MBR SP LV CPP TOS OPC H Memória vezérlő regiszterek Vezérlő jelek B sínre írja a regisztertC sínt a regiszterbe írja memóriábamemóriából Bsín Csín B A N 1, ha az eredmény < 0, különben 0, 6 Z 1, ha az eredmény = 0, különben 0. ALU ALUvezérlés 2 Léptető vezérlés Léptető 5. előadás
Pl. SP = SP + 1 • SP B sín • ALU:B+1 C • C SP memória MAR MDR PC MBR SP LV CPP TOS OPC H Memória vezérlő regiszterek Vezérlő jelek B sínre írja a regisztertC sínt a regiszterbe írja memóriábamemóriából Bsín Csín B A N 1, ha az eredmény < 0, különben 0, 6 Z 1, ha az eredmény = 0, különben 0. ALU ALUvezérlés 2 Léptető vezérlés Léptető 5. előadás
Pl. SP = SP + 1 • SP B sín • ALU:B+1 C • C SP memória MAR MDR PC MBR SP LV CPP TOS OPC H Memória vezérlő regiszterek Vezérlő jelek B sínre írja a regisztertC sínt a regiszterbe írja memóriábamemóriából Bsín Csín B A N 1, ha az eredmény < 0, különben 0, 6 Z 1, ha az eredmény = 0, különben 0. ALU ALUvezérlés 2 Léptető vezérlés Léptető 5. előadás
Pl. SP = SP + 1 • SP B sín • ALU: B+1 C • C SP memória MAR MDR PC MBR SP LV CPP TOS OPC H Memória vezérlő regiszterek Vezérlő jelek B sínre írja a regisztertC sínt a regiszterbe írja memóriábamemóriából Bsín Csín B A N 1, ha az eredmény < 0, különben 0, 6 Z 1, ha az eredmény = 0, különben 0. ALU ALUvezérlés 2 Léptető vezérlés Léptető 5. előadás
memória MAR MDR PC MBR Memóriaműveletek (4.1. ábra) • Szócímzés: 32 bites adat írása, olvasása. szó cím = 4 * (bájt cím), a túlcsorduló bitek elvesznek MAR (Memory Address Register) MDR (Memory Data Register) • Bájtcímzés: gépi szintű utasítás bájt olvasás. PC (Program Counter): bájt cím, MBR (Memory Byte Register): bájt. MBR kétfajta értelmezése (két vezérlőjel): • MBR: MBR előjel kiterjesztéssel kerül a B sínre, • MBRU: MBR előjel nélküli kiterjesztéssel kerül a B sínre. 5. előadás
Az adatút vezérlése (4.1. ábra) memória MAR MDR PC MBR SP LV CPP TOS OPC H Bsín Csín B A 6 ALU ALUvezérlés 2 Léptető 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: a C sínről regiszterekbe írás, 3 jel: a memória eléréshez 2 jel: szó íráshoz/olvasáshoz 1 jel: bájt olvasáshoz. Összesen 29 jel szükséges A B sínre csak egy regiszter írhat egyszerre, ezért 9 helyett elég 4 jel, összesen 24 vezérlő jelre van szükség. N Z Léptető vezérlés 5. előadás
Mikroutasítások 24 bit: az adatút vezérléséhez 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. NEXTADDRESS JMPC JAMNJAMZSLL8SRA1F0F1ENAENBINVAINCHOPCTOSLVSPPCMDRMARWRITEREADFETCHB sín 5. előadás
SP B sín; ALU C; C SP 5. előadás
memória MAR MDR PC MBR Memória ciklus A memória ciklus az adatút végén kezdődik (a C sínről a regiszterek 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. Az olvasás eredménye csak két ciklussal később használható az ALU-ban, 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. 5. előadás
Memória ciklus: MAR = LV; rd; TOS = MDR 5. előadás
A mikroprogram MPC 9 512x36 bites vezérlőtár (ROM) a mikroprogram tárolására MIR 4-ről 16-ra dekódoló 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. Az adatút ciklus (4.6. ábra) elején MIR feltöltődik a vezérlőtár MPC által mutatott szavával. 5. előadás
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. memória MAR MDR PC MBR SP LV CPP TOS OPC H Bsín Csín B A 6 N Z ALU 2 Léptető 5. előadás
MPC új tartalmának kialakítása 3 1 2 9 MPC 9 + Mic-1:4.6. ábra. 8 512x36 bites vezérlőtár (ROM)a mikroprogram tárolására MBR (N&JAMN) + (Z&JAMZ) JMPC JAMN/JAMZ MIR N 1 bites flip-flopok Z 5. előadás
MPC új tartalma, JAMN/JAMZ • A 9 bites következő cím (Addr) az MPC-be kerül. • (JAMN ÉS N) VAGY (JAMZ ÉS Z) és MPC legmagasabb bitjének logikai vagy kapcsolata képződik MPC legmagasabb helyértékén. Pl.: esetén a mikroprogram a 0x092 címen folytatódik, ha Z = 0,0x192 címen folytatódik, ha Z = 1. Feltételes ugrás – elágazás – a mikroprogramban. 5. előadás
JAMN: if(LV-H < 0) goto L1; else goto L2 L2+ 0x100= L1 5. előadás
MPC új tartalma, JMPC • 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 0Feltétlen ugrás az MBR-ben tárolt címre – kapcsoló utasítás: goto(MBR) vagy goto(MBR OR 0x100) Kezdődhet az újabb mikroutasítás végrehajtása. 5. előadás
JMPC: TOS=H+SP+1; goto(MBR) 5. előadás
Mic-1 működése (MPC) MIR regiszter B sín, AddrMPC ALU, léptető megtudja, mit kell csináljon, eredmény C, N, Z C regiszterekbe JAMN, JAMZ és (N), (Z) mem. MDR és/vagy alapján módosul MPC mem. MBR Memória ciklus indítása JMPC és (MBR) (rd, wr, fetch) alapján módosul MPC. 5. előadás
Mic-1 programozá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). 5. előadás
memória MAR MDR PC MBR SP LV CPP TOS OPC H Bsín Csín B A 6 N Z ALU 2 Léptető MAL (Micro Assembly Language ) SOURCE: a B sínre kötött regiszterek bármelyike: MDR, PC, MBRU (előjel nélküli - MBR Unsigned), MBR, SP, LV, CPP, TOS, OPC. 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. 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! 5. előadás
Feltétlen ugrás: goto Main1 Az Addr mezőbe Main1 címét kell írni. Feltétlen ugrás MBR szerint (kapcsoló utasítás): Ilyenkor JMPC = 1 goto (MBR ORvalue) value általában 0 vagy 0x100. 5. előadás
Feltételes elágazás, pl.: TOS (Top Of Stack) alapján Z = TOS ; if (Z) goto L1; else goto L2 // Z=1, ha TOS=0, különben Z=0. esetén a mikroprogram az L20x092 címen folytatódik, ha Z = 0, L10x192 címen folytatódik, ha Z = 1. Az L1 és L2 címek különbsége 256 (0x100) kell legyen (4.7. ábra)! 5. előadás
Eljárás: paraméterek, munka terület. 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). 5. előadás
A verem operandusok és az eredmény ideiglenes tárolására is használható (operandus verem), pl. (4.9. ábra): a1 = a2 + a3 5. előadás