Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu
-
Upload
otto-barker -
Category
Documents
-
view
25 -
download
1
description
Transcript of Zmienne lokalne, wywołanie procedur i funkcji, ramka stosu
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.
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 funkcjixor ax,ax...
funkcja: mov ax, 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 .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
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:
push ebp ; zachowujemy wartość ebp
mov ebp, esp ; ebp wskazuje na szczyt stosu
sub esp, 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:
push ebp
mov ebp, esp
sub esp, 12
mov esp, ebp
pop ebp
ret 12