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

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

description

Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu. Definiowanie funkcji. - PowerPoint PPT Presentation

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

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

Zmienne lokalne, wywołanie procedur i funkcji, ramka

stosu

Page 2: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

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.

Page 3: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

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. 

Page 4: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Przykład prostego wywołania

...call funkcja ;wywołanie funkcjixor ax,ax...

funkcja: mov ax, bx ret

Page 5: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

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.

Page 6: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Przykład wywołania printf

; NASM na system 32-bitowy

extern printf

section .textglobal main

main:

push dword [wartosc] push maskacall printfadd sp,8

mov eax,1int 80h

section .data

wartosc dd 220maska db "Arg1 = %d", 10 , 0

Page 7: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Ramka stosu

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

Page 8: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Zmienne lokalne

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

Page 9: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Ustawienie ramki stosu

void MyFunction() {

int a, b, c;...

_MyFunction:

push ebp ; zachowujemy wartość ebp

mov ebp, esp ; ebp wskazuje na szczyt stosu

sub esp, 12 ; przestrzeń dla zmiennych lokalnych

Page 10: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Zmienne lokalne

…a = 10;b = 5;c = 2;…

mov [ebp - 4], 10

mov [ebp - 8], 5

mov [ebp - 12], 2

Page 11: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

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

Page 12: Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu

Wyjście z funkcji cd.

void MyFunction3(int x, int y, int z) {

int a, b, c;...return;

}

_MyFunction3:

push ebp

mov ebp, esp

sub esp, 12

mov esp, ebp

pop ebp

ret 12