assembly - español - nasm tutorial
Puntero de base y puntero de pila (2)
Dado este pedazo de código:
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
(Este es solo el método. Previamente, presionamos el primero 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 la circunstancia de que son dword, así que cada uno de ellos tiene 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?
Cuando se llama a la función, la pila se ve así:
+-------------+
| Parameter 2 |
+-------------+
| Parameter 1 |
+-------------+
| Return Addr | <-- esp
+-------------+
luego, después de configurar el "marco de pila":
+-------------+
| Parameter 2 | <-- [ebp + 12]
+-------------+
| Parameter 1 | <-- [ebp + 8]
+-------------+
| Return Addr |
+-------------+
| saved ebp | <-- ebp
+-------------+ <-- esp
Ahora el contexto está guardado:
+-------------+
| 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.
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.