150 likes | 366 Views
Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu. Definiowanie funkcji.
E N D
Definiowanie funkcji Funkcje w asemblerze definiujemy po prostu jako zwykłe etykiety. Gdy chcemy przeskoczyć w wykonaniu naszego programu do naszej funkcji posługujemy się nazwą etykiety jako argumentem dla odpowiedniej instrukcji modyfikującej rejestr EIP i ew. rejestr CS tak aby razem wskazywały na początek funkcji.
Wywoływanie Do wywoływania funkcji używamy instrukcji call. Działa ona identycznie do instrukcji JMP z tą różnicą, że przed przeskokiem układa na stosie bieżące wartości rejestrów EIP (oraz ew. CS). Dzięki temu później można po wykonaniu funkcji, przy użyciu którejś instrukcji z rodziny ret, wrócić do miejsca gdzie ją wywoływaliśmy.
Przykład prostego wywołania ... call funkcja ;wywołanie funkcji xor ax,ax ... funkcja: movax,bx ret
Argumenty • Funkcje wymagające do swojego działania określonych argumentów mogą je otrzymywać na kilka sposobów. Najbardziej intuicyjne z nich to przekazywanie przez: • rejestry • stos • określoną lokalizację w pamięci • Spośród tych trzech metod zdecydowanie najszybsze jest przekazywanie argumentów przez rejestry, jednak najpowszechniejszą praktyką(x86) przekazywania argumentów jest użycie do tego stosu.
Przykład wywołania printf ; NASM na system 32-bitowy extern printf section .text global main main: push dword [wartosc] push maska call printf addsp,8 moveax,1 int80h section .data wartosc dd 220 maska db "Arg1 = %d", 10 , 0
Ramka stosu Ramką stosu nazywamy każdą grupę danych odłożoną na stos powiązaną z jedną funkcją:
Zmienne lokalne Zmienne lokalne w asemblerze to po prostu dane, które dana funkcja wrzuca na stos w czasie swojego działania.
Ustawienie ramki stosu void MyFunction() { int a, b, c; ... _MyFunction: pushebp; zachowujemy wartość ebp movebp,esp; ebp wskazuje na szczyt stosu subesp,12; przestrzeń dla zmiennych lokalnych …
Zmienne lokalne … a =10; b =5; c =2; … … mov[ebp-4],10 mov[ebp-8],5 mov[ebp-12],2 …
Wyjście z funkcji • Usunięcie zmiennych lokalnych, po przywróceniu ESP starej wartości. • Przywrócenie starej wartości EBP, która teraz jest na szczycie stosu • Powrót do miejsca wywołania
Wyjście z funkcji cd. void MyFunction3(int x,int y,int z) { int a, b, c; ... return; } _MyFunction3: pushebp movebp,esp subesp,12 movesp,ebp popebp ret12