Practico 10 Ej 2

Practico 10 Ej 2

de Agustin Peluffo Serradell -
Número de respuestas: 3
Buenas, quisiera saber si más allá de que la solución esté bien, también lo esté no guardar el contexto, en particular DX que sé que lo estoy perdiendo pero al no especificarlo la letra me vino la duda, y si además puedo asumir, dado que es una función de dominio en los naturales, que el contenido de DX sea mayor o igual a 0 en todas las llamadas iniciales. 

Func PROC
    CMP AX, 1
    JLE CEROUNO
    DEC AX
    CALL Func
    MOV DX, BX
    DEC AX
    CALL Func
    INC AX
    INC AX
    SUM BX, DX
    JMP FIN
CEROUNO:
    MOV BX, AX
FIN:
    RET
Func ENDP

Desde ya, muchas gracias.
En respuesta a Agustin Peluffo Serradell

Re: Practico 10 Ej 2

de Gustavo Brown -

Varios comentarios:

 - El programa que mostras debería ser compilación fiel de un programa en alto nivel que no pusiste.

 - El programa no funciona bien, probá correrlo "a mano" con valor inicial AX=3

 - En general en rutinas recursivas debés guardar el contexto y recuperarlo (usando el stack para ello). Lo de usar una operacion reversible (en tu caso usaste INC/DEC) es más bien una pisadita y hay que hacer ese tipo de cosas con cuidado (en tu caso no lo haces en todos los caminos posibles).

 - DX puede contener cualquier cosa al inicio y lo ideal es que mantenga su valor al terminar. Creo que quisiste preguntar por AX, igualmente es un tema de interpretación de la entrada. AX tiene un número no negativo de 0 a 65535 pero igualmente el programa no va a dar resultados correctos para números grandes de AX porque va a desbordar BX.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Practico 10 Ej 2

de Agustin Peluffo Serradell -
Si, en efecto la duda era por AX pero puse DX por equivocación. El código en alto nivel sería el siguiente:

unsigned short Func(unsigned short n){
    if(n <= 1)
         return n;
    else
         return Func(n-1) + Func(n-2);
    return 0;
}

Y corriéndolo a mano veo que DX puede ser modificado por la segunda llamada recursiva y usado incorrectamente por la llamada anterior.
Ahora lo que no estoy pudiendo ver es en que caso no funciona la operación reversible.

Gracias.