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