calculates factorial n! by recursive (gnu assembly)

學習軟體︰ GNU Assembly for Intel
硬體平台︰ Intel
作業平台︰ Linux、FreeBSD 和 Windows 的 MinGW
說明︰ 1.市面上的組合語言書籍大多以 MASM 為主,缺乏介紹 GNU Assembly 的書。
2.GNU Assembly 除了用在 Intel CPU上,也有其它知名 CPU 的版本,如 MIPS、SPARC等等。
GNU Assembly 更可用在「嵌入式系統」的 ARM 或 Intel CPU上。
3.GNU Assembly 和 GNU C++ 連結方式在 Windows 和 Linux 上的做法都是一致的。
4.GNU 整套開發系列是跨平台而且免費的。
 1 #Program Description:
 2 #Author:Jeremy
 3 #Creation Date:2012/9/25 10:21
 4 #Revisions:
 5 #Date: #Modified by:
 6 
 7 # calculates factorial
 8 # int fact(int n)
 9 # { if(n<=1) return (1); #終止條件,令一個標籤
10 # else return n*fact(n-1);
11 # }
12 
13 
14 .section .data 
15 msg: .asciz "計算n!,請輸入n:"
16 n: .int 0
17 ofmt:.asciz "%d"
18 .section .text# Using the stack
19 #
20 #用 global variable 
21 _main:
22 
23 .globl _main
24 movl $0, %ebx
25 pushl $msg
26 call _printf # printf("計算n!,請輸入n:")
27 addl $4, %esp
28 
29 pushl $n
30 pushl $ofmt
31 call _scanf # scanf("%d",&n)
32 addl $8, %esp
33 
34 movl n, %eax # n = %eax
35 pushl %eax
36 call fact 
37 addl $4, %esp
38 
39 pushl %ebx #printf("%d",&n)
40 pushl $ofmt 
41 call _printf
42 addl $8, %esp
43 
44 pushl $0     #exit(0)
45 call _exit
46 fact:
47 pushl %ebp 
48 movl %esp, %ebp
49 
50 movl 8(%ebp), %eax #read agrv
51 cmp $1, %eax # test for n<=1
52 jbe L1 # n <= 1 ,then go to fact_end, return n*fact(n-1)
53 subl $1, %eax
54 pushl %eax #fact(n-1)
55 call fact
56 movl 8(%ebp), %eax
57 imull %eax, %ebx    
58 jmp L2
59 L1:
60 addl $1, %ebx #if (n<=1) return 1 
61 L2:    
62 leave
63 ret
64 
65  

ref:http://203.64.187.42/99-A/Asm-99A/Asm-99A-Notes/

posted @ 2012-09-28 00:31  jeremyatchina  阅读(271)  评论(0编辑  收藏  举报