Duda respecto al calculo del stack

Duda respecto al calculo del stack

de Agustín Occhiuzzi Rodríguez -
Número de respuestas: 3

Hola buenas, quería sacarme esta duda porque cuando resuelvo recursivos en donde luego piden calcular el stack difiero un poco de la solución, mi duda es la siguiente y es : que debería sumar en el consumo del stack en un llamado recursivo? En cuanto a calcular el consumo en el paso base creo que lo tengo claro pero cuando voy a calcular el paso recursivo me entran dudas. Pongo un ejemplo simple: 

funcionEjemplo proc

"Se preserva contexto y otras operaciones de asignacion"

CMP condicion (condicion para ir al paso base)

JE casoBase

"aqui pase al paso recursivo(no cumplí la condicion del paso base)"

PUSH AX  ; pusheo un valor que tenía en ax que NO es parametro para guardar y popearlo después que es algo que hago y las soluciones no

PUSH Parametros*pusheo parametros*

CALL funcion

POP Resultado

POP AX ; recupero el que pushié anteriormente para preservarlo luego de salir de la recursion

*más codigo*


Luego del ejemplo mi pregunta es la siguiente, cuando calculo el consumo de stack de este paso recursivo, este valor (o mas valores que pusheo antes de pushear los parametros) que preservo forma parte del consumo de stack del paso recursivo? O por popearlo luego no genera un consumo extra? Desde ya muchas gracias.

En respuesta a Agustín Occhiuzzi Rodríguez

Re: Duda respecto al calculo del stack

de Gustavo Brown -

Agustín,

  Lo tenes que tomar en cuenta porque esa palabra que pusheas queda en el stack hasta que retornes de las llamadas recursivas que se hagan en tu programa. Es decir que se van apilando mientras tu rutina siga haciendo llamadas recursivas. Recién recuperas su consumo en el stack al retornar de la llamada recursiva.

Si en tu ejemplo tuvieses otra llamada recursiva luego de la primera (y luego de hacer el POP AX) entonces para el cálculo de la segunda llamada recursiva no lo tendrías en cuenta (porque recuperaste el espacio previo a llamarla).

Es decir, tenes que tener en cuenta cuantas palabras adicionales agregaste al stack desde que se activó la función hasta el punto en que comenzas a colocar los parámetros de la llamada recursiva.

Podés hacerte un esquema, ejecutando con el dedo la rutina y viendo cómo va quedando el stack a medida que ejecutás hasta la llamada recursiva. Ahi podés chequear que estés haciendo bien los cálculos.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Duda respecto al calculo del stack

de Agustín Occhiuzzi Rodríguez -
Gracias Gustavo, entendí bien pero me surgió otra duda, entonces cuando calculo este consumo del paso recursivo tengo en cuenta lo que está en el stack antes de hacerle push a los parametros, o sea que se sumarían al consumo los parametros de antes de llamar al paso recursivo , o estos no se sumarían? La misma duda tengo con el IP de cuando hago el call en el paso recursivo. Si creo que entendí bien , cuando haga un esquema a mano de todo lo que tengo en el stack cuando hago el paso recursivo sería :

CONTEXTO + DIR_RET + PARAMETROS + VALORES_QUE_PUSHEO (como el ax de mi ejemplo) + PARAMETROS_REC + DIR_RET_REC

Y mi paso base tendría consumo por ejemplo :

CONTEXTO + DIR_RET + PARAMETROS

estoy en lo correcto o estoy sumando de más?
En respuesta a Agustín Occhiuzzi Rodríguez

Re: Duda respecto al calculo del stack

de Belen Brandino -
hola,
si, todas esas cosas se suman. si quisiera hacer un esquema como dijo gustavo haria algo asi (es de otro ejercicio):

en este caso vemos la primer llamada a la función y la primer llamada recursiva. tenemos dos parametros (aquiArbolito, arquiChirimbolo), el IP y el contexto salvado al inicio del programa. Luego, en la segunda llamada se apilan en el stack los parametros correspondientes, el IP (apilado al ejecutar el CALL) y el contexto, que solo se ve el BP pero irían todos los registros, y luego todas las llamadas sucesivamente. 
Aca siempre tenes que tener cuidado de no contar algo en lo que llamas paso recursivo y luego contarlo en el paso base nuevamente. Por ejemplo, en tu caso interpreto que contas en el paso base los parámetros e IP que ya están contados en la última llamada recursiva antes del paso base haciendo PARAMETROS_REC + DIR_RET_REC
si quedan dudas pregunta de nuevo
saludos!