| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2105 人关注过本帖
标题:求高手指点此处递归调用及堆栈的用法看不懂啊
只看楼主 加入收藏
gt2363422485
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-4-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求高手指点此处递归调用及堆栈的用法看不懂啊
;========================================================
; 文件名:   A7-2.ASM
; 功能描述: 求N!
;========================================================

SSTACK    SEGMENT STACK
        DW 64 DUP(?)
SSTACK    ENDS

PUBLIC    N, RESULT        ;设置全局变量
DATA    SEGMENT
N        DB ?            ;N的范围在1~8之间
RESULT    DW ?            ;N!的结果存于该变量中
DATA    ENDS

CODE    SEGMENT
        ASSUME CS:CODE, DS:DATA

START:    MOV AX, DATA
        MOV DS, AX
        MOV AX, OFFSET RESULT
        PUSH AX
        MOV AL, N
        MOV AH, 00H
        PUSH AX
        MOV DI, 0000H
        CALL branch
        JMP START            ;在此处设置断点,观察变量
;===子程序===
branch:    PUSH BP
        MOV BP,SP
        PUSH BX
        PUSH AX
        MOV BX,[BP+DI+06H]
        MOV AX,[BP+DI+04H]
        CMP AX,0000H
        JZ A1
        PUSH BX
        DEC AX
        PUSH AX
        CALL branch                ;递归调用
        MOV BX,[BP+DI+06H]
        MOV AX,[BX]
        PUSH BX
        MOV BX,[BP+DI+04H]
        MUL BX
        POP BX
        JMP A2
A1:        MOV AX, 0001H
A2:        MOV RESULT, AX
        POP AX
        POP BX     
        POP BP
        RET 0004H
CODE    ENDS
        END START
2014-04-30 17:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:7 
不知道哪里你看不懂 哪里看懂了
2014-04-30 17:27
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
收藏
得分:7 
   递归这个概念很超前的,一般只在高级语言中使用,
可能会有些编译器能够把一个递归过程转换为循环过程~
2014-05-02 11:01
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
收藏
得分:0 
使用汇编语言来实现递归过程有一定难度的,建议保留,
鉴于初次接触汇编的同事,以下暂用循环求一下n!,
;===========初始化==========
            mov    cx , n  
            mov    ax,  1
;===========MANI===========
main:    jcxz     end
            mul     cl
            loop    main
;===========退出============
end:      int  20

如果使用debug调试,用rax命令观察运算结果
2014-05-07 14:50
apiqqz
Rank: 2
等 级:论坛游民
威 望:2
帖 子:56
专家分:25
注 册:2011-9-2
收藏
得分:0 
这个是N次递归调用吧
2014-06-26 08:32
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
收藏
得分:0 
汇编语言中没有直接支持递归运算的指令,
最终编译器是通过call,loop等指令来实现递归的,
就连12*256;59876*6852;1.25*96.365这样,
的乘法运算在高级语言中也进行了封装,使得
编程变得很容易。
2014-06-27 14:12
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
递归是重用代码块的一种机制
递归调用是不断的准备新的数据 去调用同一块代码块实现的
反汇编出来确实是用CALL来实现的  现在的编译器都这么干
但是平心而论  也是 可以用 jmp  loop实现 不过这个比较不直观

有句话说得好  所有的递归调用都是可以转化为非递归的循环

[ 本帖最后由 zhu224039 于 2014-6-27 16:12 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-27 16:10
快速回复:求高手指点此处递归调用及堆栈的用法看不懂啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058328 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved