Funciones Recursivas

Funciones Recursivas

de Lucas Borges Guillen -
Número de respuestas: 3

Buenas tardes,

Tengo una pregunta acerca de las funciones recursivas. Estoy teniendo dificultades para comprender cómo lograr que, después de ejecutar la función recursiva, el flujo del programa continúe en el siguiente bloque de código. Al observar y probar ejemplos, me di cuenta de que esto puede estar relacionado con el registro "bp", aunque no estoy seguro. Mi mayor confusión radica en cómo se actualiza este valor en la pila.

Cuando menciono "seguir al siguiente renglón", me refiero a que parece que no se está ejecutando la instrucción "pop bx" después de la llamada recursiva:

Altura_Estatico PROC
**código**
call Altura_Estatico
pop bx
**código**
Altura_Estatico ENDP

Saludos!

En respuesta a Lucas Borges Guillen

Re: Funciones Recursivas

de Federico Rivero -
Hola Lucas!

No me queda muy claro qué es lo que estás preguntando, pero si te parece que no se está ejecutando POP BX lo que tenés que hacer es poner un breakpoint antes de llamar a tu procedimiento recursivo y ejecutar paso a paso, revisando los valores de los registros luego de cada instrucción. Un problema bastante común en las funciones recursivas es dejar 'basura' en el stack y que al ejecutar RET se guarde en el IP algo que no es la dirección de memoria del llamador, eso provocaría que luego del RET se salte a otra posición de memoria y no ejecutes el POP BX. Pero la forma de descifrar el problema es debuggeando como te dije. Ejecutá paso a paso y revisá que los registros tengan los valores esperados en cada caso.

Saludos,
Federico
En respuesta a Federico Rivero

Re: Funciones Recursivas

de Lucas Borges Guillen -
"Un problema bastante común en las funciones recursivas es dejar 'basura' en el stack y que al ejecutar RET se guarde en el IP algo que no es la dirección de memoria del llamador, eso provocaría que luego del RET se salte a otra posición de memoria y no ejecutes el POP BX."
Parece que este era el problema gracias!
Pero ahora me surgió otra duda, si yo termino las funciones de modo que no vuelvan al IP del llamador, se considera mal? Por ejemplo cuando termino la función de cambiar modo y vuelvo al inicio para vovler a leer PUERTO_ENTRADA. Pero no paso por lo siguiente al llamador. Entiendo que en las funciones recursivas es un problema. Pero en otras no me da problemas y no tuve eso en cuenta.
En respuesta a Lucas Borges Guillen

Re: Funciones Recursivas

de Federico Rivero -
Hola Lucas!

Sí, es incorrecto porque dejás basura en el stack. Los procedimientos tenés que invocarlos con CALL y tienen que retornar con RET, reflejando lo que ocurre en alto nivel.

Saludos,
Federico