汇编语言典型例子详解_汇编语言递归及应用详解[附带实例]

递归子程序(recursive subrountine)是指直接或间接调用自身的子程序。递归,调用递归子程序的做法,在处理具有重复模式的数据结构时,它是一个强大的工具。例如链表和各种类型的连接图,这些情况下,程序都需要追踪其路径。

无限递归

子程序对自身的调用是递归中最显而易见的类型。例如,下面的程序包含一个名为 Endless 的过程,它不间断地重复调用自身:

;无限递归 (Endless, asm)

INCLUDE Irvine32.inc

.data

endlessStr BYTE "This recursion never stops",0

.code

main PROC

call Endless

exit

main ENDP

Endless PROC

mov edx,OFFSET endlessStr

call WriteString

call Endless

ret ;从不执行

Endless ENDP

END main

当然,这个例子没有任何实用价值。每次过程调用自身时,它会占用 4 字节的堆栈空间让 CALL 指令将返回地址入栈。RET 指令永远不会被执行,仅当堆栈溢出时,程序终止。

递归求和

实用的递归子程序总是包含终止条件。当终止条件为真时,随着程序执行所有挂起的 RET 指令,堆栈展开。举例说明,考虑一个名为 CalcSum 的递归过程,执行整数 1 到 n 的加法,其中 n 是通过 ECX 传递的输入参数。CalcSum 用 EAX 返回和数:

;整数求和 (RecursiveSum. asm)

INCLUDE Irvine32.inc

.code

main PROC

mov ecx,5 ; 计数值 = 5

mov eax,0 ; 保存和数

call CalcSum ; 计算和数

L1: call WriteDec ; 显示 EAX

call Crlf ; 换行

exit

main ENDP

;--------------------------------------------------------

CalcSum PROC

; 计算整数列表的和数

; 接收: ECX = 计数值

; 返回: EAX = 和数

;--------------------------------------------------------

cmp ecx,0 ; 检查计数值

jz L2 ; 若为零则推出

add eax,ecx ; 否则,与和数相加

dec ecx ; 计数值递减

call CalcSum ; 递归调用

L2: ret

C

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值