-
-
[旧帖]
汇编程序求解释
0.00雪花
-
发表于:
2010-10-21 22:57
1356
-
DSEG SEGMENT
N DW 0005H ;求5!
RESULT DW ? ;存放结果单元。
DSEG ENDS
STACK1 SEGMENT STACK
BUFFER DW 200 DUP (?) ;定义了200个字单元的堆栈
STACK1 ENDS
CSEG 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 ENDS
END START
这是一个求数的阶乘的程序,我这里就是有点不懂
POP AX ;取(N-1)!
MUL BYTE PTR [BP+6] :AX<--N乘以(N-1)
这里谁帮我解释一下,怎么pop ax是取到(n-1)!他这里用递归,每次调用fact 子程序,他不会执行到mul byte ptr [bp+6]处吧?还有就是后面恢复数据恢复的是多少?请大家帮忙解答下!!谢谢了!!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)