汇编-递归
递归
递归子例程(recursive subroutine) 是指直接或间接调用自身的子例程。
在处理具有重复模式的数据结构时,是一个强大的工具。
示例1:无限递归
.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc ExitProcess PROTO,dwExitCode:DWORD .data endlessStr BYTE "本例程无限递归", 0 .code func Proc enter 0,0 ;=========================== mov edx,OFFSET endlessStr call WriteString call func ;递归-调用自身 ;============================= leave ret func endp main PROC invoke func INVOKE ExitProcess,0 main ENDP END main
该例没有任何实用价值。每次过程调用自身时,都会占用4个字节的堆栈空间,使CALL指令将返回地址压入堆栈。RET指令永远不会执行, 堆栈溢出时程序终止。
示例:递归求和
执行整数1到n 的求和, 其中n是通过ECX传递的输入参数。用EAX返回和数:
.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc ExitProcess PROTO,dwExitCode:DWORD .data .code func Proc enter 0,0 ;=========================== cmp ecx,0 ;检查ecx的值 jz L2 ;若为零,则退出 add eax,ecx ;累加 dec ecx; call func ;递归调用 ;============================= L2: leave ret func endp main PROC mov ecx,5 mov eax,0 ;初始化和数 invoke func call WriteDec ;显示eax的值 call Crlf INVOKE ExitProcess,0 main ENDP END main