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 mov di, parameter mov ah, 62h int 21h mov ds, bx mov si, 80h mov cl, [si] inc si rep movsb... parameter resb 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 ah, 3dh mov al, mode 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 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 ah, 3fh mov bx, handle mov cx, mennyit_olvasson mov dx, ide_olvas ; DS:DX int 21h Eredmény: AX = ennyi byte-ot olvasott Ha Carry flag = 1, akkor hiba volt
További Op. rsz. funkcionalitások File írása mov ah, 40h mov bx, handle mov cx, mennyit_írjon mov dx, innen_írjon ; DS:DX int 21h 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 ax, 4800h ; memória foglalás mov bx, 4096 ; 64 Kbyte hely int 21h mov bp, ax mov es, bp... mov ax, 4900h ; memória felszabadítás mov es,bp int 21h mov ax, 4c00h int 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 Busz Fetch 1 Fetch 2 Fetch 3 Fetch 4 Tárol 1 Fetch 5 Fetch 6 Dekód 1 Dekód 2 Dekód 3 Dekód 4 Vár Dekód 5 Dekódoló egység Futtat 1 Futtat 2 Futtat 3 Futtat 4 Vár Végrahajtó egység Címzés 1 Vár Vár Címzés 2 Címző egység pipelining
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
Példa ADD EBX, 4 MOV EAX, [EBX] Elkerülés módja: Utasítást rakunk közéjük ADD EBX, 4 NOP MOV EAX, [EBX] AGI Picit más utasításokat használunk MOV EAX, [EBX+4] ADD 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
PPro, PII, PIII AGI 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 MOV AX, 0 SHL AX, 1 Optimalizált XOR 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