首页
社区
课程
招聘
[旧帖] 汇编程序求解释 0.00雪花
发表于: 2010-10-21 22:57 1356

[旧帖] 汇编程序求解释 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期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我和楼主一样的,也不知道什么意思
2010-10-22 08:19
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谁帮忙解释一下!!
2010-10-22 22:36
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

DEC AX ;ax减一
PUSH AX ;压入堆栈
CALL FACT ;继续调用自身
POP AX ;取(N-1)!
MUL BYTE PTR [BP+6] :AX<--N乘以(N-1)


DEC AX                                    ;ax减一
   PUSH AX   
上面是ax减1后入栈
CALL FACT                               ;继续调用自身
   POP AX   出栈,就是先减减1后的东西了!
2010-10-22 22:46
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢大侠的帮忙,但是我还是有点不懂,就是
PUSH AX ;压入堆栈
CALL FACT ;继续调用自身
POP AX ;取(N-1)!


他这里怎么取得是(N-1)!,还有就是
MUL BYTE PTR [BP+6] :AX<--N乘以(N-1)

这个指令到底执行了几次,是怎么执行的,大侠能在帮忙解释清楚点吗?
2010-10-22 22:54
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我觉得也是!
我的理解是:call fact递归的时候,只能有两种结果,a是跳到loop2,后面的mutip就根本跑不到那里去;b再跳到loop1过一遍。
总的结果就是在fact和loop1前面跑,跑到等于1了就跳到快结束那里。后面的
POP AX ;取(N-1)!
MUL BYTE PTR [BP+6] :AX<--N乘以(N-1)
根本就跑不到哪里去!
2010-10-23 19:00
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是啊,就是这样说啊!!哪位高手解释一下!!
2010-10-24 22:47
0
游客
登录 | 注册 方可回帖
返回
//