Assembly - Özyineleme
Özyinelemeli prosedür, kendisini çağıran bir prosedürdür. İki tür özyineleme vardır: doğrudan ve dolaylı. Doğrudan özyinelemede, prosedür kendisini çağırır ve dolaylı özyinelemede, birinci prosedür ikinci bir prosedürü çağırır ve bu da ilk prosedürü çağırır.
Özyineleme, çok sayıda matematiksel algoritmada gözlemlenebilir. Örneğin, bir sayının faktöriyelini hesaplama durumunu düşünün. Bir sayının faktöriyeli denklemle verilir -
Fact (n) = n * fact (n-1) for n > 0
Örneğin: 5'in faktöriyeli, 1 x 2 x 3 x 4 x 5 = 5 x faktöriyeli 4'tür ve bu, özyinelemeli bir prosedürü göstermenin iyi bir örneği olabilir. Her özyinelemeli algoritmanın bir bitiş koşulu olmalıdır, yani programın özyinelemeli çağrısı, bir koşul yerine getirildiğinde durdurulmalıdır. Faktöriyel algoritma durumunda, son koşula n 0 olduğunda ulaşılır.
Aşağıdaki program, factorial n'nin assembly dilinde nasıl uygulandığını gösterir. Programı basit tutmak için faktöriyel 3'ü hesaplayacağız.
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
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
Factorial 3 is:
6