Nasm 递归

递归过程调用本身。有两种类型:直接和间接的递归。在直接递归过程调用和间接递归,第一个程序调用了第二个过程,这反过来调用的第一个程序。

递归被发现许多的数学算法。例如,考虑的情况下,计算一个数的阶乘。一个数的阶乘是由下式给出:

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 bytekits

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
jgdo_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
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!