Assembly彙編 遞歸

遞歸過程調用本身。有兩種類型:直接和間接的遞歸。在直接遞歸過程調用和間接遞歸,第一個程序調用了第二個過程,這反過來調用的第一個程序。

遞歸被發現許多的數學算法。例如,考慮的情況下,計算一個數的階乘。一個數的階乘是由下式給出:

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

例如:5的階乘是1×2×3×4×5=5×4的階乘,並顯示一個遞歸的過程,這可能是一個很好的例子。每一個遞歸算法必須有一個結束條件,即滿足某種條件時,應停止遞歸調用的程序。階乘算法結束條件的情況下,當n爲0時,就結束了。

下面的程序顯示瞭如何階乘n的彙編語言實現。爲了保持程序簡單,我們將計算階乘3。

section .text global _start ;must be declared for using gcc
_start: ;tell linker entry yiibai

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