-
Notifications
You must be signed in to change notification settings - Fork 2
/
recursive factorial.asm
103 lines (81 loc) · 2.42 KB
/
recursive factorial.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
TITLE Calculating a Factorial (Fact.asm)
; This program uses recursion to calculate the
; factorial of an integer.
; Last update: 11/23/01
INCLUDE Irvine32.inc
.data
msgInput BYTE "Enter the vauel of n to calculate "
BYTE "the factorial (-1 to quit) : " ,0
msgOutput BYTE "The factorial is: " ,0
msgError BYTE "Error: Calculated value cannot "
BYTE "fit into 32 bits" ,0
.code
IterFactorial PROTO ; Calculate factorial non recursive
Factorial PROTO ; calculate factorial (eax)
main PROC
L1: mov edx, OFFSET msgInput ; prompt user for number
call WriteString
call ReadInt ; get an Integer from the user
call crlf
cmp eax,0 ; n less than 0?
jl quit ; if so , quit now
;INVOKE IterFactorial ; EAX = factorial(n)
jo L2 ; OF=1 if overflow
;show results
mov edx,OFFSET msgOutput ; "the factorial is:
call Writestring ;
call WriteDec ;displays factorial in EAX
jmp L3 ;continue the loop
L2: mov edx,OFFSET msgError ; error message
call WriteString
L3: call Crlf
call Crlf
loop L1 ; continue the loop
quit:
;push 12 ; calc 12!
INVOKE Factorial ; calculate factorial (eax)
INVOKE IterFactorial ; Calculate factorial non recursive
ReturnMain:
call WriteDec ; display it
call Crlf
exit
main ENDP
Factorial PROC
push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,0 ; n < 0?
ja T1 ; yes: continue
mov eax,1 ; no: return 1
jmp T2
T1: dec eax
push eax ; Factorial(n-1)
INVOKE Factorial
; Instructions from this point on execute when each
; recursive call returns.
ReturnFact:
mov ebx,[ebp+8] ; get n
mul ebx ; ax = ax * bx
T2: pop ebp ; return EAX
ret 4 ; clean up stack
Factorial ENDP
END main
; this is the non recursive factorial PROC
IterFactorial PROC
push ecx
cmp eax, 1
ja R1
mov eax, 1
jmp quit
R1 : mov ecx, eax ; ecx = K the factorial number
R2 : cmp ecx, 2
jna quit
dec ecx
mul ecx ; N = N * K
jno R2 ; repeat if no overflow
quit:
call WriteDec ;displays factorial in EAX
pop ecx
ret
IterFactorial ENDP
END main