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
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
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
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
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.
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.
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
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.
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:
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
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.
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.
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
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’
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’
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’
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’”
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
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’
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.
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.
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
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
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
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.
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
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).
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.
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!
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
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
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”!
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.
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
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!
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
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
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.
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.
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, …
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.
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
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.
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.
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.