En lenguaje ensamblador, ¿dónde se almacena el valor de retorno después de una llamada a función?
Echemos un vistazo al proceso de ejecución de la función
Cada vez que se llama a una función en el programa principal, primero coloque los parámetros en orden inverso en la pila;
Luego llame a func_name. La llamada aquí hace dos cosas: una es poner la dirección de retorno de la función en la pila y la otra es hacer la pila. El puntero de ejecución de instrucciones %eip apunta a la posición inicial de la función.
Iniciar ejecución
Ahora la función comenzará a ejecutarse, pero necesita hacer un poco de trabajo antes de que se ejecute el código de la función. Primero, coloca el valor del registro de dirección base original %ebp en la pila, porque %ebp se usará para otros fines durante la ejecución del programa, y luego copia el valor del puntero de la pila %esp en %ebp, después de lo cual %ebp se utiliza en la función. Permanece sin cambios durante la ejecución y se puede abordar desde aquí. A partir de este momento se pueden abordar los parámetros de la función.
pushl %ebp
movl %esp, %ebp
El siguiente paso es ejecutar el código de la función. La función primero guarda las variables locales en la pila, lo cual es fácil. Por ejemplo, para guardar datos largos, simplemente mueva el puntero %esp hacia abajo 4 bytes (porque la pila crece de direcciones altas a bajas) y luego mueva los datos de acuerdo con %esp. El siguiente es el contenido de la pila después de guardar dos variables locales largas:
Parámetro #N <--- N*4+4(%ebp)
...
Parámetro 2 <--- 12(%ebp)
Parámetro 1 <--- 8(%ebp)
Dirección de devolución <--- 4(%ebp)
Antiguo %ebp <--- (%ebp)
Variable local 1 <--- -4(%ebp)
Variable local 2 < ; --- -8(%ebp) y (%esp)
Como se puede ver en lo anterior, todos los parámetros de función y variables locales se pueden direccionar desde la dirección base de %ebp. Por supuesto, se puede lograr el mismo direccionamiento base sin utilizar %ebp y otros registros. Pero para la arquitectura x86, puede ser más rápido utilizar el registro %ebp.
Fin de la ejecución: