2012-04-22 18 views
26

Dato questo pezzo di codice:Base puntatore e dello stack pointer

 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 

(Questo è solo il metodo In precedenza abbiamo spinto il primo e il secondo parametro sullo stack..)

La mia domanda è: perché aggiungiamo 8 al puntatore di base per ottenere l'indirizzo del primo parametro e poi 12?

Ho il fatto che sono dword, quindi ognuno di essi è di 4 byte. Così da ebp + 8 a ebp + 12 rende sensato fare. Ma perché il primo è ebp + 8? Perché se ESP punta al TOP dello stack, mov ebp, esp significa che EBP punta al TOP dello stack. Quindi inseriamo 4 valori nello stack: eax, ebx, ecx ed edx. Perché EBP + 8 punta sul primo parametro?

risposta

39

Quando la funzione viene chiamata, lo stack si presenta come:

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

poi dopo il "stack frame" è impostato:

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

Ora il contesto è salvato:

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

Non dimenticare che su molti sistemi lo stack cresce verso il basso (e questo è sicuramente vero per la famiglia x86), quindi in cima allo stack avrà l'indirizzo di memoria più basso.

+0

+1 - Semplice, pulito e informativo. – Cyclonecode

+0

Wow abbastanza pulito! Grazie, è stato molto utile! Immagino che il punto chiave sia stato che lo Stack crescesse verso il basso! Buono a sapersi ! Hai reso la mia giornata. – yhcowboy

5

Perché ci sono altri due elementi in pila; il precedente ebp, che si preme all'inizio di questa routine, e l'indirizzo di ritorno, che viene messo in pila dalla chiamata alla routine.

+0

Non avrei mai pensato che l'indirizzo del mittente fosse stato messo in pila! molte grazie – yhcowboy

Problemi correlati