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; }
时间: 2024-11-05 12:24:31