求N的阶乘_递归调用_0~8

data segment
Number dw 8  ;预置值(0≤N≤8)
Result dw ?  ;结果
data ends

stacks segment
dw 80 dup(?)
stacks ends

code segment
assume cs:code,ds:data,ss:stacks
main:mov ax,data
mov ds,ax    ;将数据段基值装入DS
mov ax,number;取N
push ax      ;利用堆栈传递参数
call fact    ;调用递归子程序
pop result   ;送结果
mov ah,4ch   ;返回DOS
int 21h
fact proc near
push ax      ;保存调用参数
push bp      ;保存每帧的帧地址(偏移量)
mov bp,sp    ;当前帧地址(栈顶地址)送BP寄存器
mov ax,[bp+6];取参数N
cmp ax,0     ;N = 0 ?
jnz factsub  ;N≠0,继续递归调用
inc ax       ;若N=0,则0!=1
jmp exit     ;由递归调用过程转递次返回过程
factsub:dec ax;N-1送AX
push ax      ;保护各次调用参数
call fact    ;递归调用
pop ax       ;从堆栈中弹出每次压入的参数
mul word ptr [bp+6];计算各参数的乘积
exit:mov [bp+6],ax;保存中间结果和最后结果
pop bp       ;恢复BP内容
pop ax       ;恢复AX内容
ret          ;返回所调用程序
fact endp
code ends
end main

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值