给兔子掏耳朵的视频:求助N的阶乘的汇编程序~

来源:百度文库 编辑:高考问答 时间:2024/05/05 17:04:43
练习:计算N!程序实验
1.实验内容
编程计算N!(8 >=N >=0)的值。要求将计算N!编为递归子程序。
2.编程指导
由阶乘的递归定义得知:
N!=1当N=0时
N!=N*(N-1)!当N>0时
为了求得N!的值必须递归调用(N-1)!的子程序,但每次调用的参数都是不同的。第一次以N为参数,因为要求得N!,必须要先求出(N-l)!,所以第二次调用时是以(N-1)为参数。同样为了求得(N-1)!,必须先求出(N-2)!,.因此第三次调用是以(N-2)为参数,依次类推,直到参数为0时止。此时,将每一步调用的结果相乘就是最终的N!值。设计递归子程序时,必须保证每次对它的调用都不会破坏以前调用时所用的参数和中间结果,因此,在这样的子程序刚开始一般都要对现场进行进栈保护。另外,递归的结束条件也是相当重要的,选择不好,很容易造成死锁,而不能从递归子程序中返回出来。在该例中0!=1,因此,判断入口参数是否为0就是这个递归子程序递归的结束条件。
哪位大虾会做帮个忙啊~需要用上CALL以及RET指令

datarea segment
n dw 3
result dw ?
datarea ends
stack_seg segment
dw 128 dup(0)
tos label word
stack_seg ends
prognam segment
main proc far
assume cs:prognam,ds:datarea,ss:stack_seg
start:
mov ax,stack_seg
mov ss,ax
mov sp,offset tos
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
mov bx,n
push bx
call fact
pop result

mov dx, result ;result 已经放到DX中了
mov ah,2
int 21h

ret
main 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]
exit:
mov [bp+6],ax
pop bp
pop ax
ret
fact endp
prognam ends
end start