1 / 12

Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu. Definiowanie funkcji.

otto-barker
Download Presentation

Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

  2. 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.

  3. 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. 

  4. Przykład prostego wywołania ... call funkcja ;wywołanie funkcji xor ax,ax ... funkcja: movax,bx ret

  5. 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.

  6. 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

  7. Ramka stosu Ramką stosu nazywamy każdą grupę danych odłożoną na stos powiązaną z jedną funkcją:

  8. Zmienne lokalne Zmienne lokalne w asemblerze to po prostu dane, które dana funkcja wrzuca na stos w czasie swojego działania.

  9. 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 …

  10. Zmienne lokalne … a =10; b =5; c =2; … … mov[ebp-4],10 mov[ebp-8],5 mov[ebp-12],2 …

  11. 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

  12. 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

More Related