Montagem - Recursão
Um procedimento recursivo é aquele que chama a si mesmo. Existem dois tipos de recursão: direta e indireta. Na recursão direta, o procedimento chama a si mesmo e na recursão indireta, o primeiro procedimento chama um segundo procedimento, que por sua vez chama o primeiro procedimento.
A recursão pode ser observada em vários algoritmos matemáticos. Por exemplo, considere o caso de calcular o fatorial de um número. O fatorial de um número é dado pela equação -
Fact (n) = n * fact (n-1) for n > 0
Por exemplo: fatorial de 5 é 1 x 2 x 3 x 4 x 5 = 5 x fatorial de 4 e este pode ser um bom exemplo de como mostrar um procedimento recursivo. Todo algoritmo recursivo deve ter uma condição final, ou seja, a chamada recursiva do programa deve ser interrompida quando uma condição for satisfeita. No caso do algoritmo fatorial, a condição final é alcançada quando n é 0.
O programa a seguir mostra como o fatorial n é implementado em linguagem assembly. Para manter o programa simples, calcularemos o fatorial 3.
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov bx, 3 ;for calculating factorial 3
call proc_fact
add ax, 30h
mov [fact], ax
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,1 ;message length
mov ecx,fact ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
proc_fact:
cmp bl, 1
jg do_calculation
mov ax, 1
ret
do_calculation:
dec bl
call proc_fact
inc bl
mul bl ;ax = al * bl
ret
section .data
msg db 'Factorial 3 is:',0xa
len equ $ - msg
section .bss
fact resb 1
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Factorial 3 is:
6