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        ;乘到AXc语言用递归函数求n的阶乘
FACTOR_E:
    RET            ;AX=(2~8)!
FACTOR  ENDP        ;简洁明了,无与伦比
;==================================
CODE  ENDS
    END  START

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。