es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Argumentos en la pila de llamadas por encima de las variables locales en lugar de debajo de la dirección de retorno?

Estoy tratando de entender la pila de llamadas de una función con algunos ejemplos prácticos. En todos los diagramas que explican esto, se muestra así [Variables locales][Dirección de retorno][Argumentos] (la memoria más baja a la izquierda). Pero cuando estoy en el depurador gdb y hago una pausa dentro de una función, los obtengo en un orden diferente:

none
(gdb) info args
arg1 = 0
arg2 = 0
arg3 = 32767
(gdb) p &arg1
0x7ffff3a4697ec
(gdb) p &arg2
0x7ffff3a4697e8
(gdb) p &arg3
0x7ffff3a4697e4
(gdb) info locals
local1 = 0
local2 = 0
local3 = 0
(gdb) p &local1
0x7ffff3a4697fc
(gdb) p &local2
0x7ffff3a4697f8
(gdb) p &local3
0x7ffff3a4697f4
(gdb) info frame
Nivel de la pila 0, marco en 0x7ffff3a469810:

Lista de argumentos en 0x7ffff3a469800, argumentos: arg1=0, arg2=0, arg3=32767
Variables locales en 0x7ffff3a469800, sp del marco anterior es 0x7ffff3a469810
Registros guardados:
rbp en 0x7ffff3a469800, rip en 0x7ffff3a469808

¿Por qué los argumentos de la función están ubicados en direcciones de memoria más bajas que las variables locales y el puntero de retorno? Toda la literatura sobre el tema (por ejemplo, diagramas como este https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Callstacklayout.svg/342px-Callstacklayout.svg.png) implica que los argumentos deberían estar en direcciones de memoria más altas que la dirección de retorno. Y la dirección de retorno debería estar entre las variables locales y los argumentos, mientras que en mi caso las variables locales y los argumentos están en un bloque contiguo, con la dirección de retorno al final. Muchas gracias, ¡disculpe si he entendido completamente mal!

Edit: Ejemplo de programa en C para generar esto:


#include <stdio.h> void func1(int arg1, int arg2, int arg3) { int local1; int local2; int local3; local1 = 2; local2 = 3; local3 = 4; } int main(){ int a; int b; int c; func1(a, b, c); }

Compila este código con gcc code.c -o code en CentOS x86_64. Ejecútalo con gdb y coloca un punto de interrupción en func1. Observa la dirección de las variables arg, las variables locales y la dirección de retorno.</stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El orden en que se disponen los argumentos, variables locales y la dirección de retorno en la memoria está determinado por el hardware y el sistema operativo específicos que se estén utilizando. En el caso del ejemplo proporcionado, parece que la arquitectura x86-64 y el sistema operativo CentOS están utilizando un diseño de memoria diferente al que se muestra típicamente en los diagramas.

    Según la información obtenida de info args y info locals en gdb, parece que los argumentos se almacenan en direcciones de memoria más bajas que las variables locales y el puntero de retorno. Este bloque contiguo de memoria que contiene los argumentos y las variables locales está seguido por el puntero de retorno al final.

    Es importante tener en cuenta que este diseño de memoria puede variar según factores como las optimizaciones del compilador y las convenciones de llamada a funciones, por lo que es posible que un programa o plataforma diferente tenga un diseño diferente. Sin embargo, en este caso específico, parece que el diseño de memoria es el descrito anteriormente.

Comments are closed.