彙編 - 遞迴



遞迴過程是指呼叫自身的過程。遞迴分為兩種:直接和間接。直接遞迴中,過程呼叫自身,間接遞迴中,第一個過程呼叫第二個過程,而第二個過程又呼叫第一個過程。

遞迴可以在很多數學演算法中觀察到。例如,考慮計算一個數的階乘的情況。一個數的階乘由如下公式給出 -

Fact (n) = n * fact (n-1) for n > 0

例如:5 的階乘為 1 x 2 x 3 x 4 x 5 = 5 x 4 的階乘,這可以很好地展示一個遞迴過程。每個遞迴演算法必須有一個終止條件,即當某個條件滿足時,程式的遞迴呼叫應該停止。對於階乘演算法,當 n 為 0 時達到終止條件。

以下程式展示瞭如何在組合語言中實現 n 的階乘。為了讓程式保持簡單,我們將計算 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

當編譯並執行上述程式碼時,它將生成以下結果 -

Factorial 3 is:
6
廣告