Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Paraméterátadás assembly nyelvű programokban
2
Paraméterátadás assembly nyelvű programokban
ASM((type Halász Végh), előadás);
3
Többszintű tárgyalás Magasszintű nyelven mindenki jól használja; csak felidézünk (és magyarázunk!) fogalmakat Magasszintű assembly: gyakorlatból ismert; az elmélete nem teljesen megalapozott Igazi assembly: 1:1 gépi utasítás megfelelések; mit rejt el előlünk a HLA? Utasításvégrehajtási vonatkozások
4
Ismétlődő kódok Kódsorok többszöri bemásolása
Egyszerű, de sok helyet foglal Csak abszolút azonos műveletek hajthatók végre Egy példány többszöri végrehajtása Kevesebb hely kell Kód újrafelhasználás, biztonság
5
Veremtároló kialakulása
0. utasítás 1. utasítás EIP ESP FFFE adat FFFF adat
6
Veremtároló kialakulása
0. utasítás 1. utasítás EIP ESP FFFE adat FFFF adat
7
Szubrutinhívás Vezérlésátadás (hívás, CALL)
Visszatérés és folytatás (RETURN) Hogyan jegyezzük meg a visszatérési címet? Hogyan őrizzük meg a számítógép állapotát?
8
A CALL/RET utasítás hatása
előző utasítás EIP CALL SUB1 Következő utasítás . . . ESP . . . SUB1:első utasítás RET FFFE adat FFFF adat
9
A CALL/RET utasítás hatása
előző utasítás CALL SUB1 EIP Következő utasítás . . . ESP . . . SUB1:első utasítás RET FFFE adat FFFF adat
10
A CALL/RET utasítás hatása
előző utasítás CALL SUB1 EIP következő utasítás . . . ESP Vissza cím (EIP) . . . SUB1:első utasítás EIP RET FFFE adat FFFF adat
11
A CALL/RET utasítás hatása
előző utasítás CALL SUB1 Következő utasítás . . . ESP Vissza cím (EIP) . . . SUB1:első utasítás RET EIP FFFE adat FFFF adat
12
A CALL/RET utasítás hatása
előző utasítás CALL SUB1 Következő utasítás EIP . . . Vissza cím (EIP) ESP . . . SUB1:első utasítás RET FFFE adat FFFF adat EIP
13
A minimális ASM szubrutin
A főprogramban: call sub1; A szubrutinban: Sub1: ret;
14
A minimális HLA szubrutin
Gyakorlat 1. feladata A HLA főprogramban call Fgv11(T1[EBX*4],T2[ECX*2]); A HLA szubrutin procedure Fgv11(VAL i:int32; VAL j:int16); begin Fgv11; ret; end Fgv11;
15
HLA eljárások call stdout.newln; stdout.newln(); Eljárásdeklaráció:
procedure ProcName; << helyi deklarációk >> begin ProcName; << az eljárás utasításai >> end ProcName; Hívás: call stdout.newln; stdout.newln();
16
HLA opciók @NOFRAME nem kell be- és kilépő kód
@NODISPLAY egymásba ágyazás; gyorsít @NOALIGNSTACK veremcímek igazítása @noalignstk; begin minimal; ret(); end minimal;
17
A hiányzó RET hatása program missingRET; #include( "stdlib.hhf" );
begin firstProc; stdout.put( "firstProc eljárásban" nl ); end firstProc; begin secondProc; stdout.put( "secondProc eljárásban" nl ); ret(); end secondProc; begin missingRET; call firstProc; end missingRET;
18
Veremtároló használata szubrutinban
előző utasítás CALL SUB1 következő utasítás . . . ESP Vissza cím (EIP) . . . SUB1:első utasítás EIP PUSH EAX RET FFFE adat FFFF adat
19
Veremtároló használata szubrutinban
előző utasítás CALL SUB1 következő utasítás ESP EAX mentés . . . Vissza cím (EIP) . . . SUB1:első utasítás PUSH EAX EIP RET FFFE adat FFFF adat
20
Veremtároló használata szubrutinban
előző utasítás CALL SUB1 következő utasítás EAX mentés . . . ESP Vissza cím (EIP) . . . SUB1:első utasítás PUSH EAX RET EIP FFFE adat FFFF adat
21
Veremtároló használata szubrutinban
előző utasítás CALL SUB1 következő utasítás EAX mentés . . . ESP Vissza cím (EIP) . . . SUB1:első utasítás 32 1:2 PUSH EAX RET EIP FFFE adat FFFF adat
22
Extra pop hatása ESP EIP Vissza cím (extraPop) program extraPop;
#include( "stdlib.hhf" ); begin messedUpToo; stdout.put( "Entered messedUpToo" nl ); pop( eax ); ret(); end messedUpToo; begin callsMU2; stdout.put( "calling messedUpToo" nl ); messedUpToo(); stdout.put( "Returned from messedUpToo" nl ); end callsMU2; begin extraPop; stdout.put( "Calling callsMU2" nl ); callsMU2(); stdout.put( "Returned from callsMU2" nl ); end extraPop; ESP Vissza cím (extraPop) EIP
23
Extra pop hatása ESP EIP Vissza (callsMU2) Vissza cím(extraPop)
program extraPop; #include( "stdlib.hhf" ); begin messedUpToo; stdout.put( "Entered messedUpToo" nl ); pop( eax ); ret(); end messedUpToo; begin callsMU2; stdout.put( "calling messedUpToo" nl ); messedUpToo(); stdout.put( "Returned from messedUpToo" nl ); end callsMU2; begin extraPop; stdout.put( "Calling callsMU2" nl ); callsMU2(); stdout.put( "Returned from callsMU2" nl ); end extraPop; ESP Vissza (callsMU2) Vissza cím(extraPop) EIP
24
Extra pop hatása ESP EIP Vissza (callsMU2) Vissza cím (extraPop)
program extraPop; #include( "stdlib.hhf" ); begin messedUpToo; stdout.put( "Entered messedUpToo" nl ); pop( eax ); ret(); end messedUpToo; begin callsMU2; stdout.put( "calling messedUpToo" nl ); messedUpToo(); stdout.put( "Returned from messedUpToo" nl ); end callsMU2; begin extraPop; stdout.put( "Calling callsMU2" nl ); callsMU2(); stdout.put( "Returned from callsMU2" nl ); end extraPop; ESP Vissza (callsMU2) EIP Vissza cím (extraPop)
25
Extra pop hatása EIP ESP Vissza (callsMU2) Vissza cím (extraPop)
program extraPop; #include( "stdlib.hhf" ); begin messedUpToo; stdout.put( "Entered messedUpToo" nl ); pop( eax ); ret(); end messedUpToo; begin callsMU2; stdout.put( "calling messedUpToo" nl ); messedUpToo(); stdout.put( "Returned from messedUpToo" nl ); end callsMU2; begin extraPop; stdout.put( "Calling callsMU2" nl ); callsMU2(); stdout.put( "Returned from callsMU2" nl ); end extraPop; Vissza (callsMU2) EIP ESP Vissza cím (extraPop)
26
A processzor állapotának megőrzése
program nonWorkingProgram; #include( "stdlib.hhf" ); procedure PrintSpaces; begin nonWorkingProgram; mov( 20, ecx ); repeat PrintSpaces(); stdout.put( '*', nl ); dec( ecx ); until( ecx = 0 ); end nonWorkingProgram; procedure PrintSpaces; begin PrintSpaces; mov( 40, ecx ); repeat stdout.put( ' ' ); dec( ecx ); until( ecx = 0 ); end PrintSpaces;
27
A processzor állapotának megőrzése
program nonWorkingProgram; #include( "stdlib.hhf" ); procedure PrintSpaces; begin nonWorkingProgram; mov( 20, ecx ); repeat PrintSpaces(); stdout.put( '*', nl ); dec( ecx ); until( ecx = 0 ); end nonWorkingProgram; procedure PrintSpaces; begin PrintSpaces; push( eax ); push( ecx ); mov( 40, ecx ); repeat stdout.put( ' ' ); dec( ecx ); until( ecx = 0 ); pop( ecx ); pop( eax ); end PrintSpaces;
28
Egy szubrutin feladatai
Folytatás a hívás utáni utasítással Ha nem minden alkalommal ugyanazt kell csinálni: paraméterek (irány) Be- és kimenő (hogyan) Érték és cím szerint átadott (hol) regiszter, kódterület, veremtároló (mennyi) (egyéb körülmények) eredmény visszaadás
30
In 1984 Richard Stallman's Free Software Foundation (FSF) began the GNU project
36
Paraméterátadás regiszterben
// strfill- Karaktert ír egy sztringbe. // EDI- sztring mutató // AL- a sztringbe töltendő karakter. procedure begin strfill; push( edi ); // Módosítjuk! while( (type char [edi] <> #0 ) do mov( al, [edi] ); inc( edi ); endwhile; pop( edi ); end strfill; Hívása: mov( s, edi ); // Sztring mutató beállítás mov( ' ', al ); // Karakter betöltés strfill(); // Hívás
37
Paraméterátadás regiszterben
magasszintű szintaxis: procedure HasRegParms( count: uns32 in ecx; charVal:char in al ); Hívása: HasRegParms( ecx, bl ); Vigyázat: count és ecx ugyanazt jelentik! bl: extra utasítást generál
38
Paraméterátadás regiszterben
magasszintű szintaxis: procedure HasRefRegParm( var myPtr:uns32 in edi ); Hívása: HasRefRegParm( x ); "mov( &x, edi);" vagy egy "lea( edi, x);" utasítást generál
39
Paraméterátadás a kódfolyamban
program printDemo; #include( "stdlib.hhf" ); .... begin printDemo; call print; byte "Hello World!", 13, 10, 0 ; end printDemo;
40
Paraméterátadás a kódfolyamban
const // Az eljárás visszatérési cím offszetje RtnAdrs:text := "(type dword [ebp+4])"; begin print; push( ebp ); mov( esp, ebp ); push( eax ); push( ebx ); // Regiszterek megőrzése mov( RtnAdrs, ebx ); // sztring címe forever mov( [ebx], al ); breakif( !al ); stdout.putc( al ); endfor; inc( ebx ); mov( ebx, RtnAdrs ); pop( ebx ); pop( eax ); pop( ebp ); ret(); end print;
41
Paraméterátadás a kódfolyamban
const // Az eljárás visszatérési cím offszetje RtnAdrs:text := "(type dword [ebp+4])"; begin print; push( ebp ); mov( esp, ebp ); push( eax ); push( ebx ); // Regiszterek megőrzése mov( RtnAdrs, ebx ); // sztring címe forever mov( [ebx], al ); breakif( !al ); stdout.putc( al ); endfor; inc( ebx ); mov( ebx, RtnAdrs ); pop( ebx ); pop( eax ); pop( ebp ); ret(); end print; ESP EIP -8 ebx -4 eax EBP Régi EBP +4 Vissza cím +8 +12 +16
42
Paraméterátadás a kódfolyamban
const // Az eljárás visszatérési cím offszetje RtnAdrs:text := "(type dword [ebp+4])"; begin print; push( ebp ); mov( esp, ebp ); push( eax ); push( ebx ); // Regiszterek megőrzése mov( RtnAdrs, ebx ); // sztring címe forever mov( [ebx], al ); breakif( !al ); stdout.putc( al ); endfor; inc( ebx ); mov( ebx, RtnAdrs ); pop( ebx ); pop( eax ); pop( ebp ); ret(); end print; ESP -8 ebx -4 eax EIP EBP Régi EBP +4 Vissza cím + L +8 +12 +16
43
Paraméterátadás a veremtárolón át
push( i ); push( j ); push( k ); call CallProc; static RtnAdrs: dword; p1Parm: dword; p2Parm: dword; p3Parm: dword; procedure CallProc( p1:dword; p2:dword; p3:dword ); begin CallProc; pop( p3Parm ); pop( p2Parm ); pop( p1Parm ); . . . ret(); end CallProc;
44
Paraméterátadás a veremtárolón át
push( i ); push( j ); push( k ); call CallProc; static RtnAdrs: dword; p1Parm: dword; p2Parm: dword; p3Parm: dword; procedure CallProc( p1:dword; p2:dword; p3:dword ); begin CallProc; pop( RtnAdrs ); pop( p3Parm ); pop( p2Parm ); pop( p1Parm ); push( RtnAdrs ); . . . ret(); end CallProc;
45
Aktivációs rekordok Aktivációs – híváskor keletkezik
Rekord – ilyen adatszerkezet (belül van az alapcíme) Összeállítása elosztott: a hívás előtt kezdődik, az eljárás fejezi be
46
Aktivációs rekord előkészítés
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; end ARDemo; Call ARDemo( i, j, k); EIP ESP
47
Aktivációs rekord előkészítés
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; end ARDemo; Call ARDemo( i, j, k); ESP k j i EIP
48
Aktivációs rekord előkészítés
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; end ARDemo; Call ARDemo( i, j, k); ESP Vissza cím k j i EIP
49
Aktivációs rekord folytatás
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; end ARDemo; Call ARDemo( i, j, k); ESP, EBP Régi EBP EIP Vissza cím k j i
50
Aktivációs rekord folytatás
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; end ARDemo; Call ARDemo( i, j, k); ESP w b c r a EBP Régi EBP EIP Vissza cím k j i
51
Aktivációs rekord folytatás
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; mov(i,EAX); add(j, EAX); mov(EAX, a); end ARDemo; ESP w -10 b -9 c -8 r -4 a EBP Régi EBP +4 Vissza cím +8 k +12 j +16 i
52
Aktivációs rekord folytatás
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; mov(i,EAX);//mov([ebp+16], eax); add(j,EAX);//add([ebp+12],eax); mov(EAX,a);//mov(eax,[ebp-4]); end ARDemo; ESP w -10 b -9 c -8 r -4 a EBP Régi EBP +4 Vissza cím +8 k +12 j +16 i
53
Aktivációs rekord folytatás
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; end ARDemo; Call ARDemo( i, j, k); ESP w -10 b -9 c -8 r -4 a EBP Régi EBP EIP +4 Vissza cím +8 k +12 j +16 i
54
Szubrutin standard be/kilépő kód
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; push( ebp ); mov( esp, ebp ); sub( NumVars, esp ); mov( ebp, esp ); pop( ebp ); ret(ParmBytes ); end ARDemo; ESP w -10 b -9 c -8 r -4 a EBP Régi EBP +4 Vissza cím +8 k +12 j +16 i
55
Szubrutin standard be/kilépő kód
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; push( ebp ); mov( esp, ebp ); sub( NumVars, esp ); mov( ebp, esp ); pop( ebp ); ret(ParmBytes ); end ARDemo; push( ebp ); mov( esp, ebp ); sub( _vars_, esp ); mov( ebp, esp ); pop( ebp ); ret( _parms_ );
56
A 32-bites memóriaszervezés
57
Többciklusú adatelérés
58
Szubrutin standard be/kilépő kód (@noalignstack; hatása)
procedure ARDemo ( i:uns32; j:int32; k:dword ); nodisplay; var a:int32; r:real32; c:char; b:boolean; w:word; begin ARDemo; push( ebp ); mov( esp, ebp ); sub( NumVars, esp ); and( $FFFF_FFFC, esp ); mov( ebp, esp ); pop( ebp ); ret(ParmBytes ); end ARDemo; push( ebp ); mov( esp, ebp ); sub( _vars_, esp ); and( $FFFF_FFFC, esp ); mov( ebp, esp ); pop( ebp ); ret( _parms_ );
59
Érték vagy cím szerint adjunk át?
Le kell másolni és átadni Csak bemenő paraméter lehet Kevés átadott bájt esetén előnyös Cím Minden alkalommal fel kell oldani Ezt a HLA nem rejti el Nagy adatszerkezetekre előnyös Változtatni csak így tudunk
60
Függvényeredmények és a @returns opció
Eredményt általában regiszter(ek)ben adunk vissza Nagyobbat pointerként nem a függvényeredmény visszadásának helyét jelöli! A fordítás ideje alatti eredményt és nem a futási idő alatti eredményt jelöli
61
A @returns opció használata
procedure IsAlphabeticChar( c:char "EAX" ); begin IsAlphabeticChar; cs.member( c, {'a'..'z', `A'..'Z'} ); end IsAlphabeticChar; if( IsAlphabeticChar( ch ) ) then . . . endif; if( EAX ) then
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.