ISU Cvičení 7 Marta Čudová Supercomputing Technologies Research Group Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole icudova@fit.vutbr.cz
Osnova dnešního cvičení Úvod do skoků frame Volání podprogramu, předávání parametrů, lokální proměnné. PUSH, POP, CALL, RET, Řetězové instrukce Marta Čudová - ISU, 7. cvičení 2
Skoky Řídí tok programu Změna hodnoty v EIP -> skok Podmíněný skok (if-else) Využití v cyklech a podmínkách. Rozhodování podle příznaků v EFLAGS (ZF, CF) nebo ECX JZ, JE, JC, JCXZ, Nepodmíněný skok (goto) Skáče se vždy. Nevyhodnocuje se žádná podmínka, zda se skákat má nebo ne. JMP návěští Marta Čudová - ISU, 7. cvičení 3
Zásobník - opakování Velikost zásobníku je nastavena při sestavení programu. Pokud je dno nastavené na hodnotu 0xFF F, pak zásobník roste dolů k nižším adresám. Zásobník se vždy posouvá o násobky 4 ve 32bitovém režimu - minimálně o 4B PUSH val - val se uloží na vrchol zásobníku.. Nejprve ale podle velikosti operandu dekrementuje ESP (2/4B). PUSHA 16b registry se v tomto pořadí uloží na zásobník: AX, CX, DX, BX, SP, BP, SI, DI PUSHAD - 32b registry uloží na zásobník: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI POP reg hodnotu na vrcholu zásobníku uloží do registru reg. Podle velikosti operandu inkrementuje ESP (2/4B). POPA, POPAD Příklad: swap(a, b) ;eax = a, ebx = b push eax mov eax, ebx; a = b pop ebx ; b = původní a Pushing: sub esp, 4 ; alokace mista mov [esp], X ; ulož na stack Marta Čudová - ISU, 7. cvičení 4
Aplikační paměť Typicky paměť přidělená programu může být rozdělena do 4 segmentů kódový (text), datový (statické a globální proměnné), stack a heap. Každý segment je odkazován ukazatelem v segment registru. frame (rámec zásobníku) množina hodnot vložených na zásobník v rámci jednoho volání funkce. Vytváří se při volání podprogramu, kdy jsou parametry předány přes zásobník. Jednotlivé prvky zásobníku jsou vyhrazeny pro: Parametry podprogramu Lokální proměnné podprogramu Návratová adresa z volajícího podprogramu (uložený EIP) Obsahuje minimálně návratovou adresu. Heap dynamická alokace Volný prostor lokální proměnné, argumenty funkcí, Neinicializovaná data fixní velikost určená v době kompilace Inicializovaná data Code (text) fixní velikost určená v době kompilace Marta Čudová - ISU, 7. cvičení 5
Podprogram Podprogram = (často využívaná) skupina instrukcí. Volá se jako samostatná část programu. Instrukce CALL dest Provede zavolání podprogramu - uložení parametrů do zásobníku a uložení návratové adresy na zásobník (EIP). Návratová adresa je adresa místa volajícího podprogramu, odkud se provedlo volání daného podprogramu. Přejde na návěští podprogramu dest Instrukce CALL zařizuje vše s výjimkou ukládání parametrů na zásobník (to dělá programátor). Odpovídá: push eip + 2 ; navratova adresa jmp _funkce Instrukce RET [int] Zabezpečuje návrat z podprogramu Do EIP uloží návratovou adresu z vrcholu zásobníku Volitelný parametr [int] odstraní ze zásobníku int hodnot velikosti byte (= úklid + správné nastavení ESP) Marta Čudová - ISU, 7. cvičení 6
frame - příklad int total; int Square(int x) return x*x; Nižší adresa int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); Vyšší adresa Marta Čudová - ISU, 7. cvičení 7
frame - příklad int total; int Square(int x) return x*x; int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); -frame pro funkci Square() -frame pro funkci SquareOfSum() 1. push a push b push y ; 2. param. push x ; 1. param. push return addr of Return address of SquareOfSum() x (parameter) Z (local var) Return address of x (parameter) y (parameter) b (local var) a (local var) total -frame pro funkci Marta Čudová - ISU, 7. cvičení 8
frame - příklad int total; int Square(int x) return x*x; int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); 2. push z SquareOfSum() push x push return addr of SquareOfSum() -frame pro funkci SquareOfSum() Return address of SquareOfSum() x (parameter) Z (local var) Return address of x (parameter) y (parameter) b (local var) a (local var) total -frame pro funkci Square() -frame pro funkci Marta Čudová - ISU, 7. cvičení 9
frame - příklad int total; Návrat int Square(int x) return x*x; int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); 1. pop return addr of SquareOfSum() -> Návrat řízení funkci SquareOfSum() Square() Return address of SquareOfSum() x (parameter) Z (local var) Return address of x (parameter) y (parameter) b (local var) a (local var) total Kdykoliv v rámci běhu programu je vždy spouštěna funkce na vrcholu zásobníku. Ostatní čekají. Marta Čudová - ISU, 7. cvičení 10
frame - příklad int total; int Square(int x) return x*x; 2. pop x ; clean the stack (za to zodpovida volany podprogram) ; návrat do main pop z pop return addr of int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; SquareOfSum() Z (local var) Return address of x (parameter) y (parameter) b (local var) a (local var) total = SquareOfSum(a, b); printf( Result: %d\n, total); total Kdykoliv v rámci běhu programu je vždy spouštěna funkce na vrcholu zásobníku. Ostatní čekají. Marta Čudová - ISU, 7. cvičení 11
frame - příklad int total; int Square(int x) return x*x; int SquareOfSum(int x, int y) int z = Square(x+y); return z; 3. pop x ; clean the stack pop y int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); b (local var) a (local var) total Kdykoliv v rámci běhu programu je vždy spouštěna funkce na vrcholu zásobníku. Ostatní čekají. Marta Čudová - ISU, 7. cvičení 12
frame - příklad int total; int Square(int x) return x*x; 4. push par2 ; total push par1 ; string push return addr of int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); Return address of Result: %d\n total b (local var) a (local var) total -frame pro funkci printf() Kdykoliv v rámci běhu programu je vždy spouštěna funkce na vrcholu zásobníku. Ostatní čekají. Marta Čudová - ISU, 7. cvičení 13
frame - příklad int total; int Square(int x) return x*x; int SquareOfSum(int x, int y) int z = Square(x+y); return z; 5. pop par1 ; clean the stack pop par2 int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); b (local var) a (local var) total Kdykoliv v rámci běhu programu je vždy spouštěna funkce na vrcholu zásobníku. Ostatní čekají. Marta Čudová - ISU, 7. cvičení 14
frame - příklad int total; int Square(int x) return x*x; int SquareOfSum(int x, int y) int z = Square(x+y); return z; int int a = 2; int b = 5; total = SquareOfSum(a, b); printf( Result: %d\n, total); Kdykoliv v rámci běhu programu je vždy spouštěna funkce na vrcholu zásobníku. Ostatní čekají. Marta Čudová - ISU, 7. cvičení 15
Vytvoření/zničení zásobníkového rámce Vytvoření zásobníkového rámce: push ebp ; ulozeni EBP (pouzivala ho volající funkce) mov ebp, esp ; EBP=ESP ukazuje na vrchol zasobniku sub esp, X Zničení zásobníkového rámce: mov esp, ebp ; obnova ESP pop ebp ret [ebp- X] (ESP) ; posun ESP; alokace prostoru pro lokální proměnné na zásobníku, X odpovídá 4*počet_proměnných ; obnova původního EBP [ebp- 4] (1. lokální proměnná) FP [ebp] (stará hodnota EBP = frame pointer) RA [ebp+ 4] (návratová adresa) 10 [ebp+ 8] (1. argument funkce) 5 [ebp+12] (2. argument funkce) 2 [ebp+16] (3. argument funkce) Ukázka procedury, která přijímá 3 parametry a má vyhrazený prostor pro X/4 lokálních proměnných Marta Čudová - ISU, 7. cvičení 16
Několik poznámek K definici zásobníkového rámce (pohyb v něm) při volání podprogramů slouží EBP. Pro vytvoření a zničení zásobníkového rámce lze použít instrukce enter a leave Pokud chceme zavolat funkci, musíme nejprve na zásobník uložit parametry, které funkce vyžaduje (opačné pořadí než je zápis) a poté návratová adresa funkce, která volání provádí (resp. řádek, od kterého bude po návratu program pokračovat). Zásobník může přetéct stack overflow REP instrukce Opakuj instrukci tolikrát, kolik je uvedeno v registru ECX (provede: ECX -= 1, if ECX!= 0 then opakuj) REPNE, REPNZ, REPZ, REPE Marta Čudová - ISU, 7. cvičení 17
Řetězové instrukce MOVS, CMPS, SCAS, LODS, STOS, INS, OUTS Ukazatele na data jsou v registrech DS:ESI a ES:EDI Zdrojová data jsou uložena na adrese DS:ESI ( SI = Source Index) Cílová data jsou uložena na adrese ES:EDI ( DI = Destination Index) Instrukce pracují se slabikami (LODSB, SCASB, ), slovy (LODSW, MOVSW, ) nebo dvojslovy (LODSD, CMPSD, ) Instrukce automaticky zvyšuje/snižuje (podle DF) indexové registry ESI a EDI (o Byte/Word/DWord). Nastavení DF: instrukce CLD, STD CMPS, SCAS ovlivňují příznaky v EFLAGS. Marta Čudová - ISU, 7. cvičení 18
Díky za pozornost