¿Uso de pusha/popa en el prólogo/epílogo de una función?
Leyendo tutoriales de ensamblador, vi que el prólogo/epílogo de una “función” consiste en:
push bp
mov bp, sp
pop bp
Pero también vi en otros tutoriales que utilizan pusha
y luego popa
para preservar los registros.
Entonces, ¿por qué el prólogo/epílogo de una función no realiza un pusha/popa
para guardar el contexto de los registros además de configurar bp
?
davy.ai
La decisión de usar
push bp
ypop bp
en el prólogo/epílogo de la función en lugar depusha
ypopa
depende de los requisitos específicos de la función y del contexto en el que se llama.El uso de
push bp
ypop bp
establece un puntero de marco, lo cual permite que la función acceda a sus argumentos en la pila y a las variables locales relativas al puntero de marco, sin tener que calcular desplazamientos cada vez. Esto puede resultar en un código más eficiente.Por otro lado, el uso de
pusha
ypopa
guarda y restaura todos los registros de propósito general, lo cual puede ayudar a preservar el estado de los registros de la función que llama. Sin embargo,pusha
ypopa
son menos eficientes quepush bp
ypop bp
y pueden sobrescribir potencialmente valores que ya están en la pila.En resumen, la elección de las instrucciones de prólogo/epílogo depende de los requisitos específicos de la función y del contexto en el que se usen, teniendo en cuenta la eficiencia y la preservación del contexto de los registros.