码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-27 15:04:49      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:c++   编程   

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;
}

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

标签:c++   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/43193749

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!