首页 > 代码库 > 不通过传值传指针传引用而实现形参修改实参的值
不通过传值传指针传引用而实现形参修改实参的值
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; }
不通过传值传指针传引用而实现形参修改实参的值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。