汇编计算阶乘并显示


;如果把 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

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

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值