递归
递归过程是一个调用自身的过程。递归有两种:直接和间接。在直接递归中,过程调用自身,在间接递归中,第一个过程调用第二个过程,第二个过程依次调用第一个过程。递归可以在许多数学算法中观察到。例如,考虑计算数字阶乘的情况。数字的阶乘由方程式给出-
Fact (n) = n * fact (n-1) for n > 0
例如:5的阶乘是1 x 2 x 3 x 4 x 5 ,这可能是显示递归过程的一个很好的例子。每个递归算法都必须具有结束条件,即,当满足条件时,应停止程序的递归调用。在阶乘算法的情况下,当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
尝试一下
编译并执行上述代码后,将产生以下结果-