x86学习笔记P5--递归调用与堆栈传参

本文详细探讨了X86架构下的递归调用原理,通过实例展示了如何实现递归计算阶乘,并分析了递归过程中堆栈的变化。接着,介绍了如何利用堆栈传递返回值,改造函数以适应堆栈传参,并给出了相关代码示例。文章以N=5的递归计算为例,解释了堆栈结构和参数传递的细节。
摘要由CSDN通过智能技术生成

一、递归调用

首先完成X86的递归设计,先完成一个简单的例子N!

先使用AX作为返回值的方式完成递归函数的设计,即F(N) = N ? F(N - 1) X N : 1

可以完成以下代码

CALCULATE		PROC
				PUSH	BP
				MOV		BP,SP
				PUSH	DX
				PUSH	BX
				MOV		BX,[BP + 4]
				CMP		BX,0
				JNZ		CAL_1
				MOV		AX,1
				JMP		SHORT	CAL_2
CAL_1:			
				PUSH	BX
				DEC		BX

				PUSH	AX
				
				PUSH	BX
				CALL 	CALCULATE
				
				POP		AX 	
				POP		BX
				MUL		BX
CAL_2:
				MOV		[BP + 6],AX
				POP 	BX
				POP 	DX
				POP 	BP	

				RET		2
CALCULATE		ENDP

可以通过上面的代码观察堆栈结构,当N == 3时,此时栈顶为0710:01DB



那么开始考虑,不讲返回值放入寄存器中,而使用堆栈传递返回值应如何构造。

可以将返回值的地址作为参数传递也可以仿照参数的写法,设计如下堆栈结构,段内调用如下

BP
IP
参数
RETURN VALUE

针对于这样的栈结构,可以将上面的函数改写,并添加相关的函数,形成以下代码:

;利用递归求N!

STACK			SEGMENT	PARA	STACK
STACK_AREA		DW		100H	DUP(0)
STACK_BTM		EQU		$	-	STACK_AREA
STACK			ENDS

DATA			SEGMENT	PARA
N 				DW		5
DATA			ENDS

CODE			SEGMENT	PARA
				ASSUME	CS:CODE,DS:DATA,SS:STACK

DISP_NUM		MACRO		;宏定义,输出十进制ASCII码
				PUSH		DX
				MOV			AH,2
				MOV			DL,AL
				ADD			DL,30H
				INT			21H
				POP			DX
DISP_NUM		ENDM

DIVIDE			MACRO		WNUM1,WNUM2
				MOV			AX,WNUM1
				MOV			BX,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值