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
本站文章除注明转载外,均为本站原创或编译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Assembly 递归
本文地址:http://www.codeinn.net/assembly/1018.html
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Assembly 递归
本文地址:http://www.codeinn.net/assembly/1018.html