汇编语言实现递归阶乘算法代码分析(8)
2009-10-21 10:50
609 查看
来自于《Intel汇编语言程序设计》(第四版)第八章的代码,但是我总是感觉有错误,红色代码部分从逻辑上看永远不会被执行到,以下为源代码:
【注:因为使用的是32位寄存器,因此可以容纳的最大阶乘是12!(479001600)】
TITLE Calculating a Factorial ( Fact.asm )
INCLUDE Irvine32.inc
.code
main PROC
push 12 ; calc 12!
call Factorial ; calculate factorial (eax)
ReturnMain:
call WriteDec ; display it
call Crlf
exit
main ENDP
;------------------------------------------------------------------------
Factorial PROC
; Calculates a factorial
; Receives : [ebp+8] = n, the number to calculate
; Returns : eax = the factorial of n
;------------------------------------------------------------------------
push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,0 ; n>0?
ja L1 ; yes:continue
mov eax,1 ; no:return 1
jmp L2
L1: dec eax
push eax ; Factorial(n-1)
call Factorial
; Instructions from this point on execute when each
; recursive call returns.
ReturnFact:
mov ebx,[ebp+8] ; get n
mul ebx ; edx:eax = eax * ebx
L2: pop ebp ; return EAX
ret 4 ; clean up stack
Factorial ENDP
END main
为什么感觉有问题呢,红色代码什么时候才会被执行到呢?
【注:因为使用的是32位寄存器,因此可以容纳的最大阶乘是12!(479001600)】
TITLE Calculating a Factorial ( Fact.asm )
INCLUDE Irvine32.inc
.code
main PROC
push 12 ; calc 12!
call Factorial ; calculate factorial (eax)
ReturnMain:
call WriteDec ; display it
call Crlf
exit
main ENDP
;------------------------------------------------------------------------
Factorial PROC
; Calculates a factorial
; Receives : [ebp+8] = n, the number to calculate
; Returns : eax = the factorial of n
;------------------------------------------------------------------------
push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,0 ; n>0?
ja L1 ; yes:continue
mov eax,1 ; no:return 1
jmp L2
L1: dec eax
push eax ; Factorial(n-1)
call Factorial
; Instructions from this point on execute when each
; recursive call returns.
ReturnFact:
mov ebx,[ebp+8] ; get n
mul ebx ; edx:eax = eax * ebx
L2: pop ebp ; return EAX
ret 4 ; clean up stack
Factorial ENDP
END main
为什么感觉有问题呢,红色代码什么时候才会被执行到呢?
相关文章推荐
- 欧几里得求两个整数最大公约数算法的汇编递归实现代码
- 0001算法--------全排列算法分析以及JAVA代码完美实现
- JavaScript使用递归和循环实现阶乘的实例代码
- 汇编语言AAA指令多字节加法代码分析(5)
- 汇编语言二分查找排序代码分析(13)
- C语言经典算法(八)——递归实现斐波那契数列的两种方法
- 全排列问题算法分析与实现(递归、非递归)
- 算法代码实现之冒泡排序,Golang(Go语言)实现
- 算法代码实现之归并排序,Golang(Go语言)实现,自顶向下与自底向上两种方式
- c语言元素实现汇编分析
- 汇编语言数组求和代码分析
- Java JVM 1:垃圾收集算法 - 标记清除算法(伪代码实现与深入分析)
- Java JVM 2:垃圾收集算法 - 标记整理算法(伪代码实现与深入分析)
- C语言经典算法(六)——递归实现字符串长度的两种方法
- 算法设计与分析 快速排序的递归实现算法
- 使用递归下降算法分析数学表达式 -- 基于堆栈的计算器实现算法
- 算法分析之Ackerman函数的递归实现算法
- KNN分类算法原理分析及代码实现
- 汇编语言学习系列 递归实现
- 算法代码实现之堆排序,Golang(Go语言)实现