2012-04-22 4 views
26

dieses Stück Code Gegeben:Basiszeiger und Stapelzeiger

 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 

(Dies ist nur die Methode Zuvor geschoben wir den ersten und den zweiten Parameter auf dem Stapel..)

Meine Frage ist: Warum fügen wir dem Basiszeiger 8 hinzu, um zur Adresse des ersten Parameters und dann zu 12 zu gelangen?

Ich bekomme die Tatsache, dass sie dword sind, so dass jeder von ihnen 4 Bytes..so von ebp + 8 bis ebp + 12 macht es Sens zu machen. Aber warum ist der erste ebp + 8? Denn wenn ESP auf den TOP des Stacks zeigt, mov ebp, bedeutet esp, dass EBP auf den TOP des Stacks zeigt. Dann drücken wir 4 Werte auf den Stack: eax, ebx, ecx und edx. Warum zeigt EBP + 8 auf den ersten Parameter?

Antwort

39

Wenn die Funktion aufgerufen wird, sucht der Stapel wie:

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

dann nach dem "Stack-Frame" eingerichtet ist:

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

Jetzt wird der Kontext gespeichert:

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

Vergessen Sie nicht, dass auf vielen Systemen der Stack nach unten wächst (und das gilt definitiv für die x86-Familie), so dass die Der oberste Teil des Stapels hat die niedrigste Speicheradresse.

+0

+1 - Einfach, sauber und informativ. – Cyclonecode

+0

Wow schön sauber! Danke das war sehr hilfreich! Ich denke, der entscheidende Punkt war, dass der Stack nach unten wächst! Gut zu wissen ! Du hast meinen Tag gerettet. – yhcowboy

5

Da sind zwei andere Elemente auf dem Stapel; der vorherige ebp, den Sie am Anfang dieser Routine drücken, und die Rücksprungadresse, die durch den Aufruf der Routine auf den Stapel gelegt wird.

+0

Ich hätte nie gedacht, dass die Absenderadresse auf den Stapel geschoben wurde! Danke vielmals – yhcowboy

Verwandte Themen