首页 > 代码库 > 不通过传值传指针传引用而实现形参修改实参的值

不通过传值传指针传引用而实现形参修改实参的值

1、首先了解一下堆栈帧的创建步骤(来自《32位汇编语言程序设计》钱晓捷一书):

     1)主程序把传递的参数压入堆栈;

     2)调用子程序时,返回地址压入堆栈;

     3)子程序中,EBP压入堆栈;设置EBP等于ESP,通过EBP访问参数和局部变量;

     4)子程序有局部变量,ESP减去一个数值,在堆栈预留局部变量使用的空间;

      5)子程序要保护的寄存器压入堆栈。

如下图:

技术分享

技术分享

2、了解了堆栈帧之后,就可以得出以下程序:

       1)嵌入汇编实现

#include<iostream>
using namespace std;

void fun(int val=0)
{
	val=1005;

	//----------------
	__asm
	{
		lea eax,val
		mov ebx,[eax-8]
		mov eax,val
		mov [ebx-4],eax
	}
}

int main()
{
	int a=0;

	fun();
	cout<<a<<endl;
	return 0;
}
     2)
#include<iostream>
using namespace std;

void fun(int val=0)
{
	*((int*)(*(&val-2))-1)=1005;
}

int main()
{
	int a=0;

	fun();
	cout<<a<<endl;
	return 0;
}

不通过传值传指针传引用而实现形参修改实参的值