⚙️RECURSIVIDAD
Un procedimiento recursivo es aquel que se llama a si mismo. Hay dos tipos: directo o indirecto. La recursion directa, el procedimiento se llama a si mismo y en la recursion indirecta, el primer procedimiento llama a un segundo procedimiento, que a su vez llama al primer procedimiento.
La recursividad se puede observar en numerosos algoritmos matematicos. Por ejemplo, considere el caso de calcular el factorial de un numero. El factorial de un numero viene dado por la ecuacion -
Fact (n) = n * fact (n-1) for n > 0
Por ejemplo: Factorial de 5 es 1x2x3x4x5 = 5x factorial de 4 y puede ser un buen ejemplo para mostrar un procedimiento recursivo. Todo algoritmo debe tener una condicion de finalizacion, es decir, la llamada recursiva del programa debe detenerse cuando se cumple una condicion. En el caos del algoritmo factorial, la condicion final se alcanza cuando nes 0.
Veamos como se implementa el factorial n en asm. Para simplificar el programa, calcularemos el factorial 3.
section .data
msg db 'Factorial de 3 es:', 0xa
len equ $ - msg
section .bss
fact resb 1 ; Almacenamos el resultado
proc_fact: ; Nombre de la funcion
cmp bl, 1 ; Compara bl a 1 si es mayor hace calculos
jg do_calculation ; si no establece ax en 1 y retorna
mov ax, 1
ret
do_calculation:
dec bl ; Decrementamos el valor en 1 a bl
call pro_fact ; Llama a pro_fact
inc bl ; Incrementa a bl
mul bl ; multiplica el resultado ax por bl
ret
section .text
global _start
_start:
mov bx, 3 ; Carga en 3 a bx, se usara para calcular el fact
call proc_fact ; Llama a la funcion para calcular el numero fact
add ax, 30h ; Agrega 0 a ax para imprimir el valor factorial
mov [fact], ax ; Guarda ax en fact para imprimir
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
mov edx, 1
mov ecx, fact
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
Última actualización