DSEG SEGMENT N DW 0005H ;求5! RESULT DW ? ;存放结果单元。DSEG ENDSSTACK1 SEGMENT STACK BUFFER DW 200 DUP (?) ;定义了200个字单元的堆栈STACK1 ENDSCSEG SEGMENT MAIN PROC FAR ASSUME CS:CSEG,DS:DSEG,SS:STACK1 START: MOV AX,STACK1 MOV SS,AX MOV SP ,LENGTH BUFFER ;sp<—栈顶 MOV AX,0000H ;在堆栈中预留结果字单元 PUSH AX MOV AX,DSEG MOV DS,AX MOV BX,N ;bx<-N PUSH BX ;n压入堆栈 CALL FACT ;调用fact子程序 POP RESULT ;弹出结果至result MOV AH,4CH INT 21H ;返回dos RET MAIN ENDP FACT PROC NEAR PUSH AX PUSH BP ;保护数据 MOV BP,SP ;bp<-sp MOV AX,[BP+6] ;ax<-n CMP AX,1 ;ax与1比较 JNE LOOP1 ;ax不等于1,转移到loop1处 JMP LOOP2 ;相等,转到loop2处 LOOP1: DEC AX ;ax减一 PUSH AX ;压入堆栈 CALL FACT ;继续调用自身 POP AX ;取(N-1)! MUL BYTE PTR [BP+6] :AX<--N乘以(N-1) LOOP2: MOV [BP+6],AX POP BP POP AX ;恢复数据 RET FACT ENDP ; 返回主程序CSEG ENDSEND START
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
DEC AX ;ax减一 PUSH AX ;压入堆栈 CALL FACT ;继续调用自身 POP AX ;取(N-1)! MUL BYTE PTR [BP+6] :AX<--N乘以(N-1)
PUSH AX ;压入堆栈 CALL FACT ;继续调用自身 POP AX ;取(N-1)!
MUL BYTE PTR [BP+6] :AX<--N乘以(N-1)