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