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;
}原文地址:http://blog.csdn.net/a809146548/article/details/43193749