注册 登录
编程论坛 汇编论坛

求高手指点此处递归调用及堆栈的用法看不懂啊

gt2363422485 发布于 2014-04-30 17:00, 2105 次点击
;========================================================
; 文件名:   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
6 回复
#2
zklhp2014-04-30 17:27
不知道哪里你看不懂 哪里看懂了
#3
xkwy00002014-05-02 11:01
   递归这个概念很超前的,一般只在高级语言中使用,
可能会有些编译器能够把一个递归过程转换为循环过程~
#4
xkwy00002014-05-07 14:50
使用汇编语言来实现递归过程有一定难度的,建议保留,
鉴于初次接触汇编的同事,以下暂用循环求一下n!,
;===========初始化==========
            mov    cx , n  
            mov    ax,  1
;===========MANI===========
main:    jcxz     end
            mul     cl
            loop    main
;===========退出============
end:      int  20

如果使用debug调试,用rax命令观察运算结果
#5
apiqqz2014-06-26 08:32
这个是N次递归调用吧
#6
xkwy00002014-06-27 14:12
汇编语言中没有直接支持递归运算的指令,
最终编译器是通过call,loop等指令来实现递归的,
就连12*256;59876*6852;1.25*96.365这样,
的乘法运算在高级语言中也进行了封装,使得
编程变得很容易。
#7
zhu2240392014-06-27 16:10
递归是重用代码块的一种机制
递归调用是不断的准备新的数据 去调用同一块代码块实现的
反汇编出来确实是用CALL来实现的  现在的编译器都这么干
但是平心而论  也是 可以用 jmp  loop实现 不过这个比较不直观

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

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