用80x86汇编语言编程--用递归方法求阶乘

来源:互联网 发布:算法竞赛宝典淘宝 编辑:程序博客网 时间:2024/05/22 04:53

用汇编语言编一程序从键盘上接收一个数值 N,利用递归方法求 N!,并将结果在屏幕显示。

提问时间:2011-12-15 19:15 | 悬赏分:5 |

;============================================

最佳答案:


;为了简化,数字就不弄太大的了。

;如果把 N! 限定在 65535 之内,N 就不能大于 8。

;其实,让计算机来算更大的数,也是可以的,只不过是时间问题。

;程序如下:

;--------------------------------------------

DATA  SEGMENT

    INPUT_TIPS   DB  10, 13, "INPUT THE  N (0~8): $"

    OUTPUT_TIPS  DB  10, 13, "THE  N! IS : $"

DATA  ENDS

;--------------------------------------------

STACK  SEGMENT

    ;INPUT  STACK  SEGMENT  CODE  HERE

    DB  256 DUP(?)

STACK  ENDS

;--------------------------------------------

CODE  SEGMENT

    ASSUME  CS:CODE,DS:DATA,SS:STACK

START:

    MOV  AX, DATA

    MOV  DS, AX

;----------------------------------

    MOV  DX, OFFSET INPUT_TIPS

    MOV  AH, 9        ;显示字符串.

    INT  21H

    MOV  AH, 1        ;输入到 AL

    INT  21H

    CMP  AL, '0'

    JB   EXIT

    CMP  AL, '8'

    JA   EXIT

    SUB  AL, '0'

    MOV  AH, 0

    CMP  AX, 0        ;是 0 吗?

    JNZ  CMP_1

    MOV  AX, 1        ;是 0 就去显示 1

    JMP  DISP

CMP_1:

    CMP  AX, 1        ;是 1 吗?

    JZ   DISP         ;是 1 就去显示 1

    MOV  CX, AX       ;非 0 非 1,就是其它数字,那么

    CALL FACTOR       ;就用递归的方法去计算阶乘

;----------------------------------

DISP:

    PUSH AX

    MOV  DX, OFFSET OUTPUT_TIPS

    MOV  AH, 9        ;显示字符串.

    INT  21H

    POP  AX

    MOV  BX, 10

    MOV  CX, 0

L1:

    MOV  DX, 0

    DIV  BX

    PUSH DX

    INC  CX

    AND  AX, AX

    JNZ  L1

L2:

    POP  DX

    ADD  DL, 48

    MOV  AH, 2

    INT  21H

    LOOP L2

;----------------------------------

EXIT:

    MOV  AH, 4CH

    INT  21H    

;==================================

FACTOR PROC  NEAR   ;阶乘.

    DEC  CX         ;CX=2~8

    CMP  CX, 1      ;=1 ?

    JE   FACTOR_E   ;为1就退出

    PUSH CX         ;非1压栈保存

    CALL FACTOR     ;递归调用,把CX一次次的减一

    POP  CX         ;弹出一个个递减的数值

    MUL  CX         ;乘到AX

FACTOR_E:

    RET             ;AX=(2~8)!

FACTOR  ENDP        ;简洁明了,无与伦比

;==================================

CODE  ENDS

    END  START

;--------------------------------------------


程序运行时的屏幕显示如下:


C:\MASM>JIE_CH

INPUT THE  N (0~8): 0

THE  N! IS : 1


C:\MASM>JIE_CH

INPUT THE  N (0~8): 2

THE  N! IS : 2


C:\MASM>JIE_CH

INPUT THE  N (0~8): 3

THE  N! IS : 6


C:\MASM>JIE_CH

INPUT THE  N (0~8): 5

THE  N! IS : 120


C:\MASM>JIE_CH

INPUT THE  N (0~8): 4

THE  N! IS : 24


C:\MASM>JIE_CH

INPUT THE  N (0~8): 8

THE  N! IS : 40320


C:\MASM>JIE_CH

INPUT THE  N (0~8): 7

THE  N! IS : 5040


C:\MASM>JIE_CH

INPUT THE  N (0~8): 6

THE  N! IS : 720

C:\MASM>


;============================================

回答时间:2011-12-18 18:43 

向TA求助 回答者: 做而论道 | 十五级 采纳率:43% 名人 达人 

提问者对于答案的评价:谢谢

原题网址:http://zhidao.baidu.com/question/355004190.html

原题网址:http://zhidao.baidu.com/question/355582968.html

;============================================


后记:


用递归的方法计算阶乘,是任何一本汇编语言教材都必讲的内容。

这样的书,做而论道看过不少了,没有一本能看得上眼的。呵呵,又有些自大了,应该谦虚一些嘛,只是有些忍不住...

做而论道在这里给出的递归求阶乘程序,比任何一本书上的程序都简短,思路都更加清晰。

不信,大家找找书,对比看一下。

做而论道也希望有网友写出更高明的递归程序,放在留言中,供大家参考。

;============================================


0 0
原创粉丝点击