practico 10 ej 2

practico 10 ej 2

de Bruno Stefano Lombardo Palleiro -
Número de respuestas: 3

Buenas, quería saber si la idea del ejercicio era esta.

Si suponemos que el la parte a está bien, el pasaje a 8086 es correcto?

Me llamó la atención que al final no tuve que modificar el stack para que quedé bien, igual capaz que no estoy viendo algo. 

Respecto a la C, el paso base sólo ocupa 2 bytes que son de la dirección de retorno, y el paso recursivo ocuparía 4 si no me equivoco, esto es porque hago un push antes de llamar la función y a esto se le suma  la dirección de retorno.

Por lo tanto si N=5, se hacen 6 llamadas recursivas y 7 veces se llega a un caso base.

Para obtener estos datos, desarrollé la recurrencia y conté cada cosa.

Entonces el total sería:  6*4+7*2=38 bytes

Gracias

En respuesta a Bruno Stefano Lombardo Palleiro

Re: practico 10 ej 2

de Valentina Pereira Ciaffone -
Buenas, yo lo hice parecido. Salvo que no guarde n para luego hacer N-2, porque si primero haces el paso recursivo que hace AX = N-1 luego para hacer la llamada recursiva basta con decrementar nuevamente AX, obteniendo AX = N-2.
Aparte de eso, capaz comprendí mal, pero es necesario hacer push de ax y bx, porque yo no lo hago y en realidad no entiendo porque lo haces. Yo por la letra como el manejo de parámetros no es por stack lo único que hice fue ir modificando los registros AX y Bx según necesitara.
En caso de estar bien eso, y tomando en cuenta que no se pide guardar el contexto. Puede ser que el manejo de stack sea solo en funcion a la dir de retorno, porque en ningun momento modifico el stack, por lo que me parece rara la pregunta
En respuesta a Valentina Pereira Ciaffone

Re: practico 10 ej 2

de Gustavo Brown -
Para hacer lo que comentás tenes que asegurar que AX a la vuelta de la llamada recursiva tenga el mismo valor que tenía cuando lo llamaste.
Y para el caso de BX deberías guardarlo antes de la segunda llamada recursiva para poderlo sumarlo con el resultado de esta segunda llamada.
O sea no te quedarían igual el caso base con uno de los recursivos.

Saludos,
Gustavo
En respuesta a Bruno Stefano Lombardo Palleiro

Re: practico 10 ej 2

de Gustavo Brown -
Bruno,
El algoritmo de la parte a) resuelve el problema.
El pasaje a 8086 tiene algunos errores:
En el "paso recursivo" guardas AX (que contiene n) correctamente, pero luego de la primer llamada recursiva lo POPeas en CX para restarle 2 y hacer la segunda llamada recursiva. Deberias usar AX allí.
Al finalizar la segunda llamada recursiva deberías restaurar el valor de AX original, o sea sumarle 2 (asumiendo el arreglo indicado en el punto anterior), o alternativamente haberlo guardado en el stack y recuperarlo también antes y luego de la segunda llamada recursiva (si haces eso te va a cambiar el análisis de consumo de stack).

Sobre lo que te llamó la atención, no tuviste que modificar el stack para que quede bien porque los parámetros en este ejercicio se reciben y devuelven por registro, por lo que el stack solamente lo usas para preservar contexto y los PUSHs/POPs deben estar balanceados.

Tu paso base consume 2 bytes y el recursivo 4. El consumo de stack que tenes que calcular es el máximo consumo de stack que no es lo mismo que la suma de la cantidad de veces que se llega a un paso base o a un paso recursivo.
Para este ejercicio podés dibujar un diagrama de ejecucion viendo cuantas llamadas recursivas andidadas como máximo se realizan para n=5 y ahi contabilizar cuantas de ellas son llamadas recursivas y cual paso base y ahi obtener el consumo máximo de stack

Saludos,
Gustavo