用汇编语言递归方法计算8以内的阶乘

标题用汇编语言递归方法计算8以内的阶乘斜体样式

方法一

.MODEL SMALL
.DATA
STRING1 DB 'PLEASE INTPUT THE NMBER(0~8):$';	请输入n
STRING2 DB 'THE RESULT:$';						这个结果是
.CODE
main proc far
	MOV AX,@DATA;			为数据块加地址
	MOV DS,AX
    LEA DX,STRING1;			输出第一句话
    MOV AH,09H
    INT 21H 
	call decibin;			开始读入n
	mov ax,1
	call fact;				开始计算n的阶乘
	MOV BX,AX
	LEA DX,STRING2;			输出第二句话
	MOV AH,09H
	INT 21H 
	MOV AX,BX
	call output;			输出结果n!
main endp
;------------------------------
; 开始读入一个数(0~8)
decibin proc near 
    mov bx,0
newchar:
    mov ah,1
    int 21h
    sub al,30h;				小于0
    jl exit
    cmp al,9;				大于9
    jg exit
    cbw; 					al->ax
    xchg ax,bx
    mov cx,10
    mul cx;					ax*10
    xchg ax,bx
    add bx,ax
    jmp newchar
exit: 
    ret
decibin endp
;-------------------
;开始计算阶乘
fact proc near
  cmp bx,1 
  je fact1 
  push bx 
   dec bx
  call fact
  pop bx
  mul bx;					ax=ax*bx,所以前面初始化ax为1
fact1:
 ret
fact endp
;--------------------------
;开始输出结果
output proc near
OUTPUT5:
  MOV DX,0
  MOV BX,10
  DIV BX
  ADD DX,30H
  PUSH DX ;					依次压结果中的个、十、百、、、、位入栈	
  INC SI
  CWD
  CMP AX,0 
  JZ OUTPUT4		
  JMP OUTPUT5  
OUTPUT4:
  POP AX;					依次出结果中的最高位->最低位出栈
  DEC SI
  MOV DL,AL	;				依次输出结果中的最高位->最低位出栈
  MOV AH,02H
  INT 21H
  CMP SI,0
  JNZ OUTPUT4
output endp
ENDING:
  MOV AX,4C00H;		终止程序
  INT 21H
END  
`

方法二

.MODEL SMALL
.DATA
STRING1 DB 'PLEASE INTPUT THE NMBER(0~8):$';	
STRING2 DB 'THE RESULT:$';	
.CODE
main proc far
	MOV AX,@DATA
	MOV DS,AX
    LEA DX,STRING1
    MOV AH,09H
    INT 21H 
	call decibin;
	PUSH bx 
	call fact;
	pop ax	;			出栈结果
	call output;
main endp
;------------------------------
; 开始读入一个数(0~8)
decibin proc near 
    mov bx,0
newchar:
    mov ah,1
    int 21h
    sub al,30h
    jl exit
    cmp al,9
    jg exit
    cbw 
    xchg ax,bx
    mov cx,10
    mul cx
    xchg ax,bx
    add bx,ax
    jmp newchar
exit: 
    ret
decibin endp
;-------------------
;开始计算阶乘
fact   proc  near
       push  ax
       push  bp
       mov   bp, sp
       mov   ax, [bp+6]
       cmp   ax, 0
       jne   fact1
       inc   ax
       jmp   exit
fact1: dec   ax
       push  ax
       call  fact
       pop   ax
       mul   word ptr[bp+6] ;     ax=ax*bp加6位置上的数
exit:  mov   [bp+6], ax
       pop   bp
       pop   ax
       ret   
fact   endp
;--------------------------
;开始输出结果
output proc near
OUTPUT5:
  MOV DX,0
  MOV BX,10
  DIV BX
  ADD DX,30H
  PUSH DX ;		
  INC SI
  CWD
  CMP AX,0 
  JZ OUTPUT4		
  JMP OUTPUT5  
OUTPUT4:
  POP AX
  DEC SI
  MOV DL,AL
  MOV AH,02H
  INT 21H
  CMP SI,0
  JNZ OUTPUT4
output endp
ENDING:
  MOV AX,4C00H;		终止程序
  INT 21H
END  

在这里插入图片描述

发布了18 篇原创文章 · 获赞 8 · 访问量 2105

猜你喜欢

转载自blog.csdn.net/weixin_43698704/article/details/84455558