tutorial español assembler assembly x86 nasm stack-pointer

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.