2012-04-22 21 views
26

Teniendo en cuenta esta pieza de código:Base puntero y pila puntero

 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 

(Esto es sólo el método previamente empujamos el primer y el segundo parámetro en la pila..)

Mi pregunta es: ¿Por qué agregamos 8 al puntero base para llegar a la dirección del primer parámetro y luego a 12?

Me da el hecho de que son dword para que cada uno de ellos tenga 4 bytes ... así que de ebp + 8 a ebp + 12 lo hace sensato. ¿Pero por qué el primero es ebp + 8? Porque si ESP apunta al TOP de la pila, mov ebp, esp significa que EBP apunta al TOP de la pila. Luego empujamos 4 valores en la pila: eax, ebx, ecx y edx. ¿Por qué EBP + 8 apunta en el primer parámetro?

Respuesta

39

Cuando se invoca la función, la pila se ve como:

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

continuación, después de que el "marco de pila" se estableció:

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

Ahora el contexto es salvo:

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

No olvide que en muchos sistemas la pila crece hacia abajo (y eso es definitivamente cierto para la familia x86), por lo que la parte superior de la pila tendrá la dirección de memoria más baja.

+0

+1 - Simple, limpio e informativo. – Cyclonecode

+0

¡Guau, muy limpio! Gracias, esto fue muy útil! ¡Creo que el punto clave fue que la pila crece hacia abajo! Bueno saber ! Me has alegrado el día. – yhcowboy

5

Porque hay otros dos elementos en la pila; el ebp anterior, que presionas al comienzo de esta rutina, y la dirección de retorno, que se coloca en la pila mediante la llamada a la rutina.

+0

¡Nunca hubiera pensado que la dirección de retorno estaba en la pila! Muchas gracias – yhcowboy