Red de conocimientos sobre prescripción popular - Conocimiento de perdida de peso - Después de llamar a una función en lenguaje ensamblador, ¿dónde se almacena el valor de retorno de la función?

Después de llamar a una función en lenguaje ensamblador, ¿dónde se almacena el valor de retorno de la función?

El valor de retorno después de llamar a la función se almacena en EAX

Echemos un vistazo al proceso de ejecución

Cada vez que se llama a una función en el programa principal , primero inserte los parámetros en la pila en orden inverso;

Luego llame a func_name Aquí, la llamada tiene que hacer dos cosas: una es insertar la dirección de retorno de la función en la pila y la otra es. para hacer que el puntero de ejecución de la instrucción eip apunte al comienzo de la función.

Iniciar ejecución

Ahora la función está a punto de comenzar a ejecutarse, pero necesita hacer algunas cosas pequeñas antes de ejecutar el código de la función. Primero, el valor ebp del registro de dirección base original es. empujado a la pila, porque en el programa Durante la ejecución, ebp se usa para otros fines, y luego el valor del puntero de la pila esp se copia a ebp. Después de eso, ebp permanece sin cambios durante la ejecución de la función y los parámetros de la función se pueden obtener mediante. abordar esto.

pushl ebp

movl esp, ebp

El código de la función comienza a ejecutarse a continuación. La función primero guarda sus variables locales en la pila, lo cual es muy simple. Por ejemplo, si desea guardar datos largos, solo necesita mover el puntero esp hacia abajo 4 bytes (porque la dirección de crecimiento de la pila es de dirección alta a dirección baja) y luego mover los datos de acuerdo con esp. Lo siguiente es después de guardar el contenido de la pila larga de dos variables locales:

Parámetro #N lt;--- N*4 4(ebp)

...

Parámetro 2 lt;--- 12(ebp)

Parámetro 1 lt;--- 8(ebp)

Dirección de devolución lt;--- 4(ebp)

Antiguo ebp lt ;--- (ebp)

Variable local 1 lt;--- -4(ebp)

Variable local 2 lt;--- - 8 (ebp) y (esp)

De lo anterior se puede ver que se puede acceder a todos los parámetros de función y variables locales a través del direccionamiento de dirección base ebp. Por supuesto, también puede utilizar otros registros para realizar el direccionamiento. misma dirección base sin direccionamiento de dirección ebp. Pero para estructuras x86, puede ser más rápido utilizar el registro ebp.

Fin de la ejecución: