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.
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
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.
Tenés razon, AX quedó reversible correctamente.