2012-04-22 10 views
26

Biorąc pod uwagę ten kawałek kodu:bazowy wskaźnik i wskaźnik stosu

 swap: 

      push ebp ; back up the base pointer, 
      mov ebp, esp 
      ; push the context of the registers on the stack 

      push eax 
      push ebx 
      push ecx 
      push edx 

      mov eax, [ebp+8] ; address of the first parameter 
      mov ebx, [ebp+12] ; address of the second parameter 
      mov dl, [eax] 
      mov cl, [ebx] 

      mov [eax], cl 

      mov [ebx], dl 

      ; restore the context of the registers from the stack 

      pop edx 
      pop ecx 
      pop ebx 
      pop eax 
      ; restore the ebp 
      pop ebp 
      ret 

(To jest właśnie metoda Wcześniej pchnął pierwszy i drugi parametr na stosie.).

Moje pytanie brzmi: dlaczego dodajemy 8 do wskaźnika podstawowego, aby uzyskać adres pierwszego parametru, a następnie 12?

Dostaję fakt, że są dword, więc każdy z nich ma 4 bajty, a więc od ebp + 8 do ebp + 12 robi sens. Ale dlaczego pierwszym jest ebp + 8? Ponieważ ESP wskazuje na GÓRĘ stosu, mov ebp, esp oznacza, że ​​EBP wskazuje na GÓRĘ stosu. Następnie wciskamy 4 wartości na stosie: eax, ebx, ecx i edx. Dlaczego EBP + 8 wskazuje na pierwszy parametr?

Odpowiedz

39

Gdy funkcja jest wywoływana, stos wygląda tak:

+-------------+ 
| Parameter 2 | 
+-------------+ 
| Parameter 1 | 
+-------------+ 
| Return Addr | <-- esp 
+-------------+  

następnie po "ramka stosu" jest ustawiona:

+-------------+ 
| Parameter 2 | <-- [ebp + 12] 
+-------------+ 
| Parameter 1 | <-- [ebp + 8] 
+-------------+ 
| Return Addr | 
+-------------+  
| saved ebp | <-- ebp 
+-------------+ <-- esp 

Teraz kontekst zostanie zapisany:

+-------------+ 
| Parameter 2 | <-- [ebp + 12] 
+-------------+ 
| Parameter 1 | <-- [ebp + 8] 
+-------------+ 
| Return Addr | 
+-------------+  
| saved ebp | <-- ebp 
+-------------+ 
| saved eax | 
+-------------+  
| saved ebx | 
+-------------+  
| saved ecx | 
+-------------+  
| saved edx | <-- esp 
+-------------+  

Nie zapominaj, że w wielu systemach stos rośnie w dół (co zdecydowanie dotyczy rodziny x86), więc wierzchołek stosu będzie miał najniższy adres pamięci.

+0

+1 - Prosty, czysty i pełen informacji. – Cyclonecode

+0

Wow całkiem czysty! Dzięki temu było to bardzo pomocne! Sądzę, że kluczowym punktem było to, że stos rośnie w dół! Dobrze wiedzieć ! Zrobiłeś mój dzień. – yhcowboy

5

Ponieważ na stosie znajdują się jeszcze dwa inne przedmioty; poprzedni ebp, który naciskasz na początku tej procedury, oraz adres zwrotny, który jest umieszczany na stosie przez wywołanie procedury.

+0

Nigdy bym nie pomyślał, że adres zwrotny został zepchnięty na stos! Wielkie dzięki – yhcowboy