Feltteles fordts A fordt programok ltalban gy az
Feltételes fordítás A fordító programok általában – így az assembler is – feltételes fordítási lehetőséget biztosít. Ez azt jelenti, hogy a program bizonyos részeit csak abban az esetben fordítja le, ha – a fordítóprogram számára ellenőrizhető – feltétel igaz illetve hamis. IFxx feltétel. . . ; lefordul, ha a feltétel igaz ELSE ; el is maradhat. . . ; lefordul, ha a feltétel hamis ENDIF Máté: Architektúrák 9. előadás 1
IF kifejezés IFE kifejezés IF 1 IF 2 IFDEF Szimbólum IFNDEF Szimbólum Máté: Architektúrák ; ; ; igaz, ha kifejezés 0 igaz, ha kifejezés=0 igaz a fordítás első menetében igaz a fordítás második menetében igaz, ha Szimbólum definiált igaz, ha Szimbólum nem definiált 9. előadás 2
arg IFB IFNB IFIDN IFDIF ; igaz, ha ; arg üres (blank) arg ; igaz, ha ; arg nem üres arg 1 , arg 2 ; igaz, ha ; arg 1 arg 2 teljesül arg 1 , arg 2 ; igaz, ha ; arg 1 arg 2 nem teljesül Máté: Architektúrák 9. előadás 3
Makró és blokk ismétlés Makró definíció: M_név MACRO. . . ENDM [fpar 1[, fpar 2. . . ]] ; makró fej (kezdet) ; makró törzs ; makró vége fpar 1, fpar 2. . . formális paraméterek vagy egyszerűen paraméterek. A makró definíció nem lesz része a lefordított programnak, csupán azt határozza meg, hogy később mit kell a makró hívás helyére beírni (makró kifejtés, helyettesítés). A makró törzsön belül előfordulhat makró hívás és másik makró definíció is. Máté: Architektúrák 9. előadás 4
Makró hívás: M_név [apar 1[, apar 2. . . ]] apar 1, apar 2. . . aktuális paraméterek vagy argumentumok. A műveleti kód helyére írt M_név hatására a korábban megadott definíció szerint megtörténik a makró helyettesítés, más néven makró kifejtés. Ez a makró törzs bemásolását jelenti, miközben az összes paraméter összes előfordulása a megfelelő argumentummal helyettesítődik. A helyettesítés szövegesen történik, azaz minden paraméter – mint szöveg – helyére a megfelelő argumentum – mint szöveg – kerül. A helyettesítés nem rekurzív. Makró hívás argumentuma sem lehet makró hívás. Az argumentumnak megfelelő formális paraméternek lehet olyan előfordulása, amely a későbbiek során makró hívást eredményez. Máté: Architektúrák 9. előadás 5
Dupla szavas összeadás: (DX: AX)+(CX: BX) Eljárás deklaráció: EDADD PROC ADD ADC RET EDADD ENDP Máté: Architektúrák NEAR AX, BX DX, CX Makró definíció: MDADD MACRO ADD ADC ENDM 9. előadás AX, BX DX, CX 6
Ha a programban valahol dupla szavas összeadást kell végezzünk, akkor hívnunk kell az eljárást illetve a makrót: Eljárás hívás: CALL EDADD Makró hívás: MDADD Futás közben felhívásra kerül Fordítás közben megtörténik a az EDADD eljárás makró helyettesítés: ADD AX, BX ADC DX, CX Futás közben ez a két utasítás kerül csak végrehajtásra. Máté: Architektúrák 9. előadás 7
Látható, hogy eljárás esetén kettővel több utasítást kell végrehajtanunk, mint makró esetében (CALL EDADD és RET). Még nagyobb különbséget tapasztalunk, ha (CX: BX) helyett paraméterként kívánjuk megadni az egyik összeadandót: Máté: Architektúrák 9. előadás 8
Eljárás deklaráció: EDADD 2 PROC NEAR PUSH BP MOV BP, SP ADD AX, 4[BP] ADC DX, 6[BP] POP BP RET 4 EDADD ENDP Makró definíció: MDADD 2 MACRO IFB P ADD ADC ELSE ADD ADC ENDIF ENDM P AX, BX DX, CX AX, P DX, P+2 Most sem része a makró definíció a lefordított programnak. Máté: Architektúrák 9. előadás 9
Ha SI az összeadandónk címét tartalmazza, akkor a felhívások a következőképpen alakulnak: PUSH CALL 2[SI] EDADD 2 MDADD 2 [SI] Futás közben végrehajtásra Fordítás közben a hívás az ADD AX, [SI] kerül a paraméter átadás, az ADC DX, [SI]+2 eljárás hívás, az eljárás: összesen 9 utasításokra cserélődik, futás közben csak ez a két utasítás kerül végrehajtásra. Máté: Architektúrák 9. előadás 10
Megjegyzés: Az MDADD 2 makrót úgy írtuk meg, hogy ha híváskor nem adunk meg paramétert, akkor az eredeti feladatot oldja meg, ekkor ugyanis az IFB P feltétel teljesül. Máté: Architektúrák 9. előadás 11
Paraméter másutt is előfordulhat a makró törzsben, nemcsak az operandus részen, pl. : PL macro p 1, P 2 mov ax, p 1 P 2 p 1 endm PL Adat, INC mov INC ax, Adat hatása: Máté: Architektúrák 9. előadás 12
A &, %, ! karakterek továbbá a <> és ; ; speciális szerepet töltenek be makró kifejtéskor. & (helyettesítés operátor): • ha a paraméter – helyettesített – értéke része egy szónak; • idézeten belüli helyettesítés: errgen macro y, x err&y db ’Error &y: &x’ endm errgen 5, <Unreadable disk> hatása: err 5 Máté: Architektúrák db ’Error 5: Unreadable disk’ 9. előadás 13
<> (literál szöveg operátor): Ha aktuális paraméter szóközt vagy , -t is tartalmaz. Az előző példa eredménye <> nélkül: err 5 db ’Error 5: Unreadable’ adat macro db endm p p adat <’abc’, 13, 10, 0> ’abc’, 13, 10, 0 db db ’abc’, 13, 10, 0 ’abc’ kifejtve: Máté: Architektúrák 9. előadás 14
! (literál karakter operátor): Az utána következő karaktert makró kifejtéskor közönséges karakterként kell kezelni. Pl. : a korábbi errgen makró errgen 103, <Expression !> 255> hívásának hatása: err 103 db ’Error 103: Expression > 255’ de errgen 103, <Expression > 255> hívásának hatása: err 103 db ’Error 103: Expression’ Máté: Architektúrák 9. előadás 15
% (kifejezés operátor): Az utána lévő argumentum (kifejezés is lehet) értéke – és nem a szövege – lesz az aktuális paraméter. Pl. : sym 1 equ 100 sym 2 equ 200 txt equ ’Ez egy szöveg’ kif macro db endm exp, val ”&exp = &val” kif <sym 1+sym 2>, %(sym 1+sym 2) txt, %txt db db ”sym 1 + sym 2 = 300” ”txt = ’Ez egy szöveg’” Máté: Architektúrák 9. előadás 16
Az alábbi példa a % használatán kívül a makró törzsön belüli makró hívást is bemutatja: s = 0 Err. Msg MACRO text s = s+1 Msg %s, text ENDM Msg MACRO msg&sz db ENDM Máté: Architektúrák sz, str 9. előadás 17
Err. Msg ’syntax error’ makró hívás hatására bemásolásra kerül (. LALL hatására látszik a listán) az s = s+1 Msg %s, ’syntax error’ szöveg. s értéke itt 1 -re változik. Újabb makró hívás (Msg). A %s paraméter az értékére (1) cserélődik, majd kifejtésre kerül ez a makró is, ebből kialakul: msg 1 db ’syntax error’ Egy újabb hívás és hatása: Err. Msg ’invalid operand’ msg 2 db ’invalid operand’ Máté: Architektúrák 9. előadás 18
; ; (makró kommentár): A makró definíció megjegyzéseinek kezdetét jelzi. A ; ; utáni megjegyzés a makró kifejtés listájában nem jelenik meg. Máté: Architektúrák 9. előadás 19
LOCAL c 1[, c 2. . . ] c 1, c 2, . . . minden makró híváskor más, ? ? xxxx alakú szimbólumra cserélődik, ahol xxxx a makró generátor által meghatározott hexadecimális szám. A LOCAL operátort közvetlenül a makró fej utáni sorba kell írni. KOPOG macro n LOCAL ujra mov cx, n ujra: KOPP loop ujra endm Ha a programban többször hívnánk a KOPOG makrót, akkor a LOCAL operátor nélkül az ujra címke többször lenne definiálva. Máté: Architektúrák 9. előadás 20
Makró definíció belsejében lehet másik makró definíció is. A belső makró definíció csak a külső makró meghívása után jut érvényre, válik láthatóvá. Pl. : shifts macro OPNAME&S MACRO mov OPNAME ENDM endm Máté: Architektúrák OPNAME ; makrót ; definiáló makró OPERANDUS, N cl, N OPERANDUS, cl 9. előadás 21
Ha ezt a makrót felhívjuk pl. : shifts ROR akkor a RORS MACRO OPERANDUS, N mov cl, N ROR OPERANDUS, cl ENDM makró definíció generálódik. Mostantól meghívható a RORS makró is, pl. : RORS AX, 5 aminek a hatása: mov cl, 5 ROR AX, cl Máté: Architektúrák 9. előadás 22
Makró definíció belsejében meghívható az éppen definiálás alatt lévő makró is (a makró hívás ezáltal rekurzívvá válik). Pl. : PUSHALL macro reg 1, reg 2, reg 3, reg 4, reg 5 IFNB <reg 1> ; ; ha a paraméter nem üres push reg 1 ; ; az első regiszter mentése PUSHALL reg 2, reg 3, reg 4, reg 5 ; ; rekurzió ENDIF ENDM Most pl. a PUSHALL ax, bx, cx makró hívás hatása: push ax push bx push cx Máté: Architektúrák 9. előadás 23
Részletezve: PUSHALL ax, bx, cx makró hívás hatása: push ax PUSHALL bx, cx az újabb hívás hatása: push bx PUSHALL cx az újabb hívás hatása: push cx PUSHALL ennek hatására nem generákódik semmi. Máté: Architektúrák 9. előadás 24
FL_CALLELJ = 0 CALLELJ macro ; ; Eljárást beépítő és felhívó makró LOCAL FIRST ; ; nem lenne fontos IF FL_CALLELJ ; ; a 2. hívástól igaz call Elj ; ; elég felhívni az eljárást EXITM ; ; makró helyettesítés vége ENDIF FL_CALLELJ = 1 ; ; csak az első híváskor JMP FIRST ; ; jut érvényre Elj proc ; ; eljárás deklaráció. . . ret Elj endp FIRST: call Elj ; ; az eljárás felhívása endm Máté: Architektúrák 9. előadás 25
Az első hívás hatására a FL_CALLELJ = 1 JMP ? ? 0000 Elj proc. . . ret Elj endp ? ? 0000: call Elj utasítások generálódnak (? ? 0000 a FIRST-ből keletkezett). Máté: Architektúrák 9. előadás 26
A további hívások esetén csak egyetlen utasítás, a call Elj utasítás generálódik. A megoldás előnye, hogy az eljárás csak akkor része a programnak, ha a program tartalmazza az eljárás felhívását is, és mégsem kell törődjünk azzal, hogy hozzá kell-e szerkesztenünk a programhoz vagy se. Máté: Architektúrák 9. előadás 27
Megváltoztathatunk egy makró definíciót azáltal, hogy újra definiáljuk. Makró definíción belül előfordulhat másik makró definíció. E két lehetőség kombinációjából adódik, hogy a makró definíción belül megadhatunk ugyanarra a makró névre egy másik definíciót, ezáltal készíthető olyan makró, amely „átdefiniálja” önmagát. Az önmagát átdefiniáló makrók esetében a belső és külső definíciót lezáró ENDM utasítások között egyetlen utasítás sem szerepelhet – még kommentár sem! Máté: Architektúrák 9. előadás 28
Önmagát „átdefiniáló” makró (az előző feladat másik megoldása): CALLELJ 2 macro jmp Elj 2 proc ; külső makró definíció FIRST ; eljárás deklaráció . . . ret Elj 2 endp FIRST: call CALLELJ 2 MACRO Máté: Architektúrák Elj 2 ; eljárás hívás ; belső makró definíció call Elj 2 ; eljárás hívás ENDM ; belső makró definíció vége endm ; külső makró definíció vége 9. előadás 29
CALLELJ 2 első hívásakor a kifejtés eredménye: jmp Elj 2 proc FIRST ; eljárás deklaráció . . . ret Elj 2 endp FIRST: call Elj 2 CALLELJ 2 MACRO ; belső makró definíció call Elj 2 ENDM Máté: Architektúrák ; eljárás hívás ; belső makró definíció vége 9. előadás 30
A kifejtés CALLELJ 2 újabb definícióját tartalmazza, ez felülírja az eredeti definíciót, és a továbbiak során ez a definíció érvényes. Ez alapján a későbbi hívások esetén call Elj 2 a kifejtés eredménye. Megjegyezzük, hogy most is szerencsésebb lett volna a FIRST címkét lokálissá tenni. Igaz, hogy csak egyszer generálódik, de így annak, aki használni akarja a CALLELJ 2 makrót, annak tudnia kell, hogy a FIRST címke már „foglalt”! Máté: Architektúrák 9. előadás 31
Ha egy M_név makró definíciójára nincs szükség a továbbiak során, akkor a PURGE M_név pszeudo utasítással kitörölhetjük. Máté: Architektúrák 9. előadás 32
Blokk ismétlés Nemcsak a blokk definíciójának kezdetét jelölik ki, hanem a kifejtést (hívást) is előírják. A program más részéről nem is hívhatók. Blokk ismétlés kifejezés-szer: REPT. . . ENDM Máté: Architektúrák kifejezés ; ez a rész ismétlődik 9. előadás 33
Pl. a korábban ismertetett kopogást így is megoldhattuk volna: REPT N KOPP ENDM Ha pl. N=3, akkor ennek a hatására a KOPP makró hívások generálódnak. Megjegyzés: Most N nem lehet változó – fordítási időben ismert kell legyen az értéke! Máté: Architektúrák 9. előadás 34
Blokk ismétlés argumentum lista szerint: IRP par, <arg 1[, arg 2. . . ]>. . . ; ez a rész többször bemásolásra. . . ; kerül úgy, hogy par rendre. . . ; felveszi az arg 1, arg 2. . . értéket ENDM IRP db ENDM x, <1, 2, 3> x db db db 1 2 3 Máté: Architektúrák 9. előadás 35
Blokk ismétlés string alapján: IRPC par, string. . . ; ez a rész kerül többször. . . ; bemásolásra úgy, . . . ; hogy par rendre felveszi. . . ; a string karaktereit ENDM Ezt a string-et nem kell idézőjelek közé tenni (újabb ismétlés jelentene). Ha a string-en belül pl. szóköz vagy , is előfordul, akkor <> jelek közé kell tenni. Az előző feladatot így is megoldhattuk volna: IRPC x, 123 db x ENDM Máté: Architektúrák 9. előadás 36
Makró definíció tartalmazhat blokk ismétlést, és blokk ismétlés is tartalmazhat makró definíciót vagy makró hívást. Pl. : A bit léptető és forgató utasítás kiterjesztésnek egy újabb megoldása: ; makrót definiáló blokkismétlés IRP OP, <RCR, RCL, ROR, ROL, SAR, SAL> OP&S MACRO OPERANDUS, N mov cl, N OP OPERANDUS, cl ENDM Ennek a megoldásnak előnye, hogy nem kell külön meghívnunk a külső makrót az egyes utasításokkal, mert ezt elvégzi helyettünk az IRP blokk ismétlés. Máté: Architektúrák 9. előadás 37
Pentium II Felülről kompatibilis az I 8088, …, Pentium Pro-val. 29. 000, …, 7. 5 millió tranzisztor, 242 láb, 233 MHz, 32 bites gép, 64 bites adat sín. SEC (Single Edge Cartridge) tokozás (3. 43. ábra). Két szintű belső gyorsító tár: • 16 KB utasítás + 16 KB adat, • 512 KB közös másodlagos (fele olyan gyors, mint a CPU). 32 B-os gyorsító sor (cash line). 1 vagy 2 CPU közös memóriával (szimatolás - snoop). Két külső szinkron sín (PCI és ISA): 2. 30. ábra. Máté: Architektúrák 9. előadás 38
Pentium II logikai lábkiosztása (3. 44. ábra) Sínütemezés: BPRI#: magas prioritású igény engedélyezése, LOCK#: sín foglalás több ciklusra, Kérés: A#: 8 bájtos adat címe (64 GB címezhető), ADS#: a cím érvényes, REQ#: kívánság, Válasz: RS#: státus, TRDY#: a szolga tud adatot fogadni, Adat: D#: 8 bájtos adat, DRDY#: az adat a sínen van, DBSY#: a sín foglalt. RESET#: a CPU alapállapotba hozatala, Megszakítások: régi vezérlő, és APIC (Advanced Programmable Interrupt Controller), VID: 5 különböző tápfeszültség kódolása, … Máté: Architektúrák 9. előadás 39
Pentium II memória sín A memóriaigények, tranzakciók 6 állapota: 6 fázisú csővezeték (3. 44. ábra bal oldal, 3. 45. ábra), fázisonként külön vezérlő vonalakkal (amint a mester megkap valamit, elengedi a vonalakat): 1. Sínkiosztás (ütemezés, bus arbitration): melyik sínmester következik, 2. Kérés: cím a sínre, kérés indítása, 3. Hibajelzés: a szolga hibát jelez(het), 4. Szimatolás: a másik CPU gyorsító tárában, 5. Válasz: kész lesz-e az adat a következő ciklusban, 6. Adat: megvan az adat. Máté: Architektúrák 9. előadás 40
Pentium II CPU mikroarchitektúrája (4. 46. ábra) Magas szintű csővezeték: Betöltő/Dekódoló, Elküldő/Végrehajtó és Befejező egység, a Mikroművelet tárterületen (Re. Order Buffer – ROB, átrendező puffer) keresztül kommunikálnak. Betöltő/Dekódoló: az utasításokat szétdarabolja, a mikroműveleteket ROB-ba teszi. Elküldő/Végrehajtó: a ROB-ban lévő utasításokat – esetleg eltérő sorrendben – végrehajtja. Befejező: sorrendben befejezi az összes mikroművelet végrehajtását, frissíti a regisztereket. memória – sín illesztő – gyorsító tárak Máté: Architektúrák 9. előadás 41
Betöltö/Dekódoló (4. 47. ábra): IFU 0: ha a puffere üres, 32 bájtos gyorsító sort tölt be. IFU 1: legfeljebb 30 utasítás határát megkeresi. IFU 2: beteszi egy sorba az utasításokat. ID 0: kettő az egyszerű utasításokat, a harmadik a többit dekódolja (mint Mic-4), mikroműveletenként: művelet kód, két forrás és egy cél regiszter. ID 1: sorba állító, jövendöléshez 4 bites előzmény figyelés + statikus jövendölés. RAT: regiszter lefoglaló, 40 firkáló regiszter WAR és WAW függőség feloldására, regiszter átnevezések. ROB: max. 3 mikroművelet kiosztása ciklusonként. Máté: Architektúrák 9. előadás 42
Elküldő/Végrehajtó (4. 48. ábra): ütemezi és végrehajtja a mikroműveleteket, feloldja a függőségeket és erőforrás igény ütközéseket. Egy ciklusban öt művelet is kiosztható. Foglalóhely: 20 elemű sor azoknak a műveleteknek, amelyeknek minden operandusa megvan. Portok: ezekhez kapcsolódnak a végrehajtó egységek. Ha több művelet osztható ki egy végrehajtó egységnek, akkor bonyolult algoritmus dönt, pl. : egy elágazás végrehajtása elsőbbséget élvez egy aritmetikai művelettel szemben. Portonként sorbaállás lehetséges. Máté: Architektúrák 9. előadás 43
Befejező: Ez küldi az eredményeket a megfelelő helyre – regiszterbe és az Elküldő/Végrehajtóba, ahol az eredményre várnak RAW függőség esetén. Az utasításokat a programban lévő sorrendben fejezi be, még akkor is, ha a végrehajtás sorrendje ettől eltért. A feltételesen végrehajtott utasítások eredményét eldobja, ha ezeket az utasításokat nem kellett volna végrehajtani. Máté: Architektúrák 9. előadás 44
- Slides: 44