Assembly
Iványi Péter
További Op. rsz. funkcionalitások • PSP címének lekérdezése mov ah, 62h int 21h Eredmény: BX = PSP szegmens címe
További Op. rsz. funkcionalitások • Paraméterek kimásolása
parameter
mov mov int mov mov mov inc rep ... resb
di, parameter ah, 62h 21h ds, bx si, 80h cl, [si] si movsb 256
További Op. rsz. funkcionalitások • File létrehozása – FCB módszer – HANDLE segítségével mov ah, 3ch mov cx, attributum mov dx, file_neve ; végén nulla,DS:DX int 21h Eredmény: AX = HANDLE, ezzel lehet rá hivatkozni Carry flag = 1, akkor hiba volt
További Op. rsz. funkcionalitások • Attribútum: CX 00h 01h 02h 04h 08h 10h
Attribútum Normál Csak-olvasható (read-only) Rejtett (hidden) Rendszer (system) Archive Könyvtár (directory)
További Op. rsz. funkcionalitások • File megnyitása mov mov mov int
ah, 3dh al, mode dx, file_neve ; végén nulla,DS:DX 21h
Eredmény: AX = HANDLE, ezzel lehet rá hivatkozni Carry flag = 1, akkor hiba volt
További Op. rsz. funkcionalitások • Mód: AL 0 1 2
Mód Csak olvasás Csak írás Írás és olvasás
További Op. rsz. funkcionalitások • File lezárása mov ah, 3eh mov bx, handle int 21h
További Op. rsz. funkcionalitások • File olvasás mov mov mov mov int
ah, bx, cx, dx, 21h
3fh handle mennyit_olvasson ide_olvas ; DS:DX
Eredmény: AX = ennyi byte-ot olvasott Ha Carry flag = 1, akkor hiba volt
További Op. rsz. funkcionalitások • File írása mov mov mov mov int
ah, bx, cx, dx, 21h
40h handle mennyit_írjon innen_írjon ; DS:DX
Eredmény: Ha CX=0 akkor a file végéhez fűz hozzá
További Op. rsz. funkcionalitások AX=4800h BX=kérendő memória mérete paragrafusban INT 21h
• Eredmény AX=a lefoglalt memória címe Ha Carry flag=1 akkor hiba volt
További Op. rsz. funkcionalitások AX=4900h ES=foglalás során az AX regiszterben megkapott cím INT 21h
Példa mov mov int mov mov ... mov mov int mov int
ax, bx, 21h bp, es,
4800h ; memória foglalás 4096 ; 64 Kbyte hely ax bp
ax, 4900h ; memória felszabadítás es,bp 21h ax, 4c00h 21h
Optimalizálás
Optimalizálás • „Premature optimization is the root of the evil” • Csak akkor és ott optimalizáljunk ahol számít – Végezzünk méréseket
80486 mikroprocesszor Fetch 1
Fetch 2
Fetch 3
Fetch 4
Tárol 1
Dekód Dekód Dekód Dekód 1 2 3 4 Futtat 1
Futtat 2 Címzés 1
Futtat 3 Vár
„pipelining”
Fetch 5 Vár Futtat 4 Vár
Fetch Busz 6 Dekód Dekódoló egység 5 Vár
Végrahajtó egység
Címzés Címző egység 2
Address generation interlock (AGI) • Memória cím kiszámítása egy órajel ciklust igényel • A pipeline-ban általában külön lépés/fázis, addig számoljuk míg az előző utasítást végrehajtjuk • DE – Ha a címzés függ az előző utasítástól akkor egy extra órajelciklust várni kell
AGI • Példa ADD MOV
EBX, 4 EAX, [EBX]
• Elkerülés módja: – Utasítást rakunk közéjük ADD NOP MOV
EBX, 4 EAX, [EBX]
– „Picit” más utasításokat használunk MOV ADD
EAX, [EBX+4] EBX, 4
AGI • A stack pointer (SP) -en keresztül is előfordulhat AGI – Például: PUSH, POP, CALL, RET esetén ha előtte MOV, ADD, SUB műveletet használtunk az SP-vel ADD ESP,4 POP
; AGI várakozás
MOV ESP, EBP RET
; AGI várakozás
AGI • PPro, PII, PIII – Nincs AGI memória olvasásra – Memória írás esetén még mindig van, de nem túl jelentős
Utasítás párosítás • A Pentium processzornak két végrehajtó egysége van – Egy órajel ciklus alatt két utasítást lehet végrehajtani
• Nem párosíthatók az utasítások – Ha az utasítások nem párosíthatóak – A két utasítás között regiszter függőség van – Az utasítások nincsennek a utasítás cache-ben
Nem párosítható utasítások • Bit léptetés vagy bit forgatás ha a CL regisztert használjuk • A komplex matematikai műveletek: MUL, DIV • Kiterjesztett utasítások: RET, ENTER, PUSHA, REP STOS • Bizonyos mat coprocesszor műveletek: FSCALE, FLDCW • Szegmensek közötti utasítások: PUSH szegmens, CALL far cím
Párosítható utasítások • Legtöbb ALU utasítás: ADD, INC, XOR • Összehasonlító utasítások: CMP, TEST • Regisztereket használó PUSH és POP
Regiszter függőség • Az első utasítás frissíti a regisztert amit a második utasítás használ MOV EAX, 8 MOV [EBP], EAX
• Mindkét utasítás ugyanabba a regiszterbe ír MOV EAX, 8 MOV EAX, [EBP]
Regiszter függőség, de párosítható • Az első utasítás olvas a regiszterből a második ír, az párosítható: MOV EAX, EBX MOV EBX, [EBP]
32 bites regiszterek • A 32 bites utasítások végrehajtása gyorsabb mint a 16 bites utasításoké • Az EAX regiszter használata egy byte-al rövidebb utasítást eredményez • DS használata ES helyett szintén gyorsabb
Egyéb optimalizálás • Kerüljük a felesleges utasításokat: SUB AX, CX CMP AX, 0 JZ címke
; beállítja a státuszt ; ez is beállítja a státuszt
Egyéb optimalizálás • A rövidebb op kód általában gyorsabb végrehajtást is jelent – Nem mindig igaz
• A kevesebb utasítás gyorsabb végrehajtást jelent – Nem mindig igaz
Egyéb optimalizálás Eredeti
Optimalizált
MOV
XOR
AX, 0
SHL AX, 1
AX, AX
ADD AX, AX
Egyéb optimalizálás • Használjunk biteltolást szorzásra MUL helyett SHL
• Használhatjuk a LEA utasítást is LEA
CX, [DX+DX*4]
; CX = DX * 5
Egyéb optimalizálás • Kerüljük a komplex utasításokat LOOP, ENTER, LEAVE
• Például LOOP utasítás helyett DEC CX JNZ ciklus
• Így bármely regiszter használható • Gyorsabb
Egyéb optimalizálás • Használjuk a TEST utasítást az AND helyett annak ellenőrzésére hogy az érték zérus-e – Nem pazaroljuk az időt, hogy eltároljuk az eredményt
Egyéb optimalizálás • Bizonyos utasítások esetén ha az AX vagy EAX regisztert használjuk akkor rövidebb lesz a gépi kód add ecx,4000
81 C1 4000
add eax,4000
05 4000
Egyéb optimalizálás • Kerüljük, hogy a regiszterekbe folyamatosan adatot töltsünk, ha egyszer betöltöttük az adatot, akkor őrizzük meg
Egyéb optimalizálás • LODSx, MOVSx, STOSx utasítások gyorsabbak 386 processzoron mint a 486-os processzoron