44
Máté: Architektú rák 9. előadás 1 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

Feltételes fordítás

  • Upload
    aelan

  • View
    49

  • Download
    2

Embed Size (px)

DESCRIPTION

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. IFxxfeltétel - PowerPoint PPT Presentation

Citation preview

Page 1: Feltételes fordítás

Máté: Architektúrák 9. előadás 1

Feltételes fordításA 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

Page 2: Feltételes fordítás

Máté: Architektúrák 9. előadás 2

IF kifejezés ; igaz, ha ; kifejezés0

IFE kifejezés ; igaz, ha ; kifejezés=0

IF1 ; igaz a fordítás ; első menetében

IF2 ; igaz a fordítás ; második menetében

IFDEFSzimbólum ; igaz, ha Szimbólum ; definiált

IFNDEF Szimbólum ; igaz, ha Szimbólum ; nem definiált

Page 3: Feltételes fordítás

Máté: Architektúrák 9. előadás 3

IFB arg ; igaz, ha ; arg üres (blank)

IFNB arg ; igaz, ha ; arg nem üres

IFIDNarg1,arg2 ; igaz, ha ; arg1arg2

teljesülIFDIFarg1,arg2 ; igaz, ha

; arg1arg2 nem teljesül

Page 4: Feltételes fordítás

Máté: Architektúrák 9. előadás 4

Makró és blokk ismétlésMakró definíció: M_névMACRO [fpar1[,fpar2...]]; makró fej (kezdet)

... ; makró törzsENDM ; makró vége

fpar1,fpar2... 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.

Page 5: Feltételes fordítás

Máté: Architektúrák 9. előadás 5

Makró hívás: M_név [apar1[,apar2...]]

apar1,apar2... 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.

Page 6: Feltételes fordítás

Máté: Architektúrák 9. előadás 6

Dupla szavas összeadás: (DX:AX)(DX:AX)+(CX:BX)

Eljárás deklaráció:EDADD PROC NEAR

ADD AX,BX ADC DX,CXRET

EDADD ENDP

Makró definíció:MDADD MACRO

ADD AX,BXADC DX,CXENDM

Page 7: Feltételes fordítás

Máté: Architektúrák 9. előadás 7

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 az EDADD eljárás

Fordítás közben megtörténik a makró helyettesítés:

ADD AX,BXADC DX,CX

Futás közben ez a két utasítás kerül csak végrehajtásra.

Page 8: Feltételes fordítás

Máté: Architektúrák 9. előadás 8

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:

Page 9: Feltételes fordítás

Máté: Architektúrák 9. előadás 9

Most sem része a makró definíció a lefordított programnak.

Eljárás deklaráció:EDADD2 PROC NEAR

PUSH BPMOV BP,SP ADD

AX,4[BP]ADC DX,6[BP]POP BPRET 4

EDADD ENDP

Makró definíció:MDADD2 MACRO PIFB P

ADD AX,BXADC DX,CX

ELSEADD AX,PADC DX,P+2

ENDIFENDM

Page 10: Feltételes fordítás

Máté: Architektúrák 9. előadás 10

Ha SI az összeadandónk címét tartalmazza, akkor a felhívások a következőképpen alakulnak:

PUSH 2[SI]PUSH [SI]CALL EDADD2

MDADD2 [SI]

Futás közben végrehajtásra kerül a paraméter átadás, az eljárás hívás, az eljárás: összesen 9 utasítás

Fordítás közben a hívás azADD AX,[SI]ADC DX,[SI]+2

utasításokra cserélődik, futás közben csak ez a két utasítás kerül végrehajtásra.

Page 11: Feltételes fordítás

Máté: Architektúrák 9. előadás 11

Megjegyzés: Az MDADD2 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 Pfeltétel teljesül.

Page 12: Feltételes fordítás

Máté: Architektúrák 9. előadás 12

Paraméter másutt is előfordulhat a makró törzsben, nemcsak az operandus részen, pl.:

PL macro p1,P2mov ax,p1P2 p1endm

PL Adat, INChatása:

mov ax,AdatINC Adat

Page 13: Feltételes fordítás

Máté: Architektúrák 9. előadás 13

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, xerr&y db ’Error &y: &x’

endm

errgen 5, <Unreadable disk>hatása:err5 db ’Error 5: Unreadable disk’

Page 14: Feltételes fordítás

Máté: Architektúrák 9. előadás 14

<> (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:

err5 db ’Error 5: Unreadable’

adat macro pdb pendm

adat <’abc’,13,10,0>adat ’abc’,13,10,0

kifejtve:db ’abc’,13,10,0db ’abc’

Page 15: Feltételes fordítás

Máté: Architektúrák 9. előadás 15

! (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: err103 db ’Error 103: Expression > 255’

deerrgen 103, <Expression > 255>

hívásának hatása: err103 db ’Error 103: Expression’

Page 16: Feltételes fordítás

Máté: Architektúrák 9. előadás 16

% (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.:

sym1 equ 100sym2 equ 200txt equ ’Ez egy szöveg’

kif macro exp, valdb ”&exp = &val”endm

kif <sym1+sym2>, %(sym1+sym2)kif txt, %txt

db ”sym1 + sym2 = 300”db ”txt = ’Ez egy szöveg’”

Page 17: Feltételes fordítás

Máté: Architektúrák 9. előadás 17

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 = 0ErrMsg MACRO texts = s+1

Msg %s,textENDM

Msg MACRO sz,strmsg&sz db str

ENDM

Page 18: Feltételes fordítás

Máté: Architektúrák 9. előadás 18

ErrMsg ’syntax error’makró hívás hatására bemásolásra kerül (.LALL hatására

látszik a listán) azs = 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:

msg1 db ’syntax error’

Egy újabb hívás és hatása: ErrMsg ’invalid operand’msg2 db ’invalid operand’

Page 19: Feltételes fordítás

Máté: Architektúrák 9. előadás 19

;; (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.

Page 20: Feltételes fordítás

Máté: Architektúrák 9. előadás 20

LOCALc1[,c2...]c1, c2, ... 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.

KOPOGmacro nLOCAL ujramov cx,n

ujra:KOPPloop ujraendm

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.

Page 21: Feltételes fordítás

Máté: Architektúrák 9. előadás 21

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 ; makrót ; definiáló makró

OPNAME&S MACRO OPERANDUS,Nmov cl, NOPNAME OPERANDUS,clENDMendm

Page 22: Feltételes fordítás

Máté: Architektúrák 9. előadás 22

Ha ezt a makrót felhívjuk pl.:shifts ROR

akkor aRORS MACRO OPERANDUS,N

mov cl, NROR OPERANDUS,clENDM

makró definíció generálódik. Mostantól meghívható a RORS makró is, pl.:

RORS AX, 5aminek a hatása: mov cl, 5

ROR AX,cl

Page 23: Feltételes fordítás

Máté: Architektúrák 9. előadás 23

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 reg1,reg2,reg3,reg4,reg5IFNB <reg1> ;; ha a paraméter nem üres

push reg1 ;; az első regiszter mentése

PUSHALL reg2,reg3,reg4,reg5 ;; rekurzióENDIF

ENDMMost pl. a

PUSHALL ax, bx, cxmakró hívás hatása:

push axpush bxpush cx

Page 24: Feltételes fordítás

Máté: Architektúrák 9. előadás 24

Részletezve:PUSHALL ax, bx, cx

makró hívás hatása:push axPUSHALL bx, cx

az újabb hívás hatása:push bxPUSHALL cx

az újabb hívás hatása:push cxPUSHALL

ennek hatására nem generákódik semmi.

Page 25: Feltételes fordítás

Máté: Architektúrák 9. előadás 25

FL_CALLELJ= 0CALLELJ 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 igazcallElj ;; elég felhívni az eljárástEXITM ;; makró helyettesítés vége

ENDIFFL_CALLELJ= 1 ;; csak az első híváskor JMP FIRST ;; jut érvényre

Elj proc;; eljárás deklaráció...ret

Elj endpFIRST:callElj ;; az eljárás felhívásaendm

Page 26: Feltételes fordítás

Máté: Architektúrák 9. előadás 26

Az első hívás hatására a FL_CALLELJ = 1

JMP ??0000Elj proc

...ret

Elj endp??0000: call Eljutasítások generálódnak (??0000 a FIRST-ből

keletkezett).

Page 27: Feltételes fordítás

Máté: Architektúrák 9. előadás 27

A további hívások esetén csak egyetlen utasítás, acall 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.

Page 28: Feltételes fordítás

Máté: Architektúrák 9. előadás 28

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!

Page 29: Feltételes fordítás

Máté: Architektúrák 9. előadás 29

Önmagát „átdefiniáló” makró (az előző feladat másik megoldása):

CALLELJ2 macro ; külső makró definíciójmp FIRST

Elj2 proc; eljárás deklaráció...ret

Elj2 endpFIRST:callElj2; eljárás hívásCALLELJ2 MACRO ; belső makró definíció callElj2; eljárás hívásENDM; belső makró definíció végeendm; külső makró definíció vége

Page 30: Feltételes fordítás

Máté: Architektúrák 9. előadás 30

CALLELJ2 első hívásakor a kifejtés eredménye:

jmp FIRSTElj2 proc ; eljárás deklaráció...ret

Elj2 endpFIRST: call Elj2 ; eljárás hívásCALLELJ2 MACRO ; belső makró definíció call Elj2 ; eljárás hívásENDM ; belső makró definíció vége

Page 31: Feltételes fordítás

Máté: Architektúrák 9. előadás 31

A kifejtés CALLELJ2 ú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 Elj2a 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 CALLELJ2 makrót, annak tudnia kell, hogy a FIRST címke már „foglalt”!

Page 32: Feltételes fordítás

Máté: Architektúrák 9. előadás 32

Ha egy M_név makró definíciójára nincs szükség a továbbiak során, akkor a

PURGE M_névpszeudo utasítással kitörölhetjük.

Page 33: Feltételes fordítás

Máté: Architektúrák 9. előadás 33

Blokk ismétlésNemcsak 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 kifejezés... ; ez a rész ismétlődikENDM

Page 34: Feltételes fordítás

Máté: Architektúrák 9. előadás 34

Pl. a korábban ismertetett kopogást így is megoldhattuk volna:REPT NKOPPENDM

Ha pl. N=3, akkor ennek a hatására a

KOPPKOPPKOPP

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!

Page 35: Feltételes fordítás

Máté: Architektúrák 9. előadás 35

Blokk ismétlés argumentum lista szerint:

IRP par, <arg1[,arg2...]>... ; ez a rész többször bemásolásra ... ; kerül úgy, hogy par rendre... ; felveszi az arg1,arg2... értéketENDM

IRP x, <1,2,3>db xENDM

db 1db 2db 3

Page 36: Feltételes fordítás

Máté: Architektúrák 9. előadás 36

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 karaktereitENDM

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,123db xENDM

Page 37: Feltételes fordítás

Máté: Architektúrák 9. előadás 37

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 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.

Page 38: Feltételes fordítás

Máté: Architektúrák 9. előadás 38

Pentium IIFelülről kompatibilis az I8088, …, 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.

Page 39: Feltételes fordítás

Máté: Architektúrák 9. előadás 39

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, …

Page 40: Feltételes fordítás

Máté: Architektúrák 9. előadás 40

Pentium II memória sínA 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.

Page 41: Feltételes fordítás

Máté: Architektúrák 9. előadás 41

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 (ReOrder 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

Page 42: Feltételes fordítás

Máté: Architektúrák 9. előadás 42

Betöltö/Dekódoló (4.47. ábra):IFU0: ha a puffere üres, 32 bájtos gyorsító sort tölt be.IFU1: legfeljebb 30 utasítás határát megkeresi.IFU2: beteszi egy sorba az utasításokat.ID0: 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.

ID1: 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.

Page 43: Feltételes fordítás

Máté: Architektúrák 9. előadás 43

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.

Page 44: Feltételes fordítás

Máté: Architektúrák 9. előadás 44

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.