我有点好奇,跟踪一下esp的变化情况,不知道这样理解是否可以。
我是初学者,想和大家交流,你怎么理解的?
//编译环境WIN XP sp2
//vc 6.0
//e-mail: shoow@126.com
#include char *aa='esp in test=xn ';
int k;
void _ _ declspec (已命名) test ) )
{
__asm
{
推送ebp
mov k,esp
mov ebp,esp
}
__asm
{
JMP退出
推送k
push aa
呼叫打印
add esp,4*2
}
__asm
{
exit:
推送k
push aa
呼叫打印
add esp,44h
mov esp,ebp
pop ebp
ret
}
}
intvirtualesp(int_esp ) )
{
/*
push _esp
呼叫虚拟
*/
//保存函数调用前的esp的值。 因为压迫呼叫
//因为在前面按下_esp,所以_esp减4
int esp=_esp-4;
//以及压入函数的返回地址
esp -=4;
/*
0040B7C0 55 push ebp
0040B7C1 8B EC mov ebp,esp
0040B7C3 83 EC 44 sub esp,44h
0040B7C6 53 push ebx
0040B7C7 56 push esi
0040B7C8 57 push edi
0040B7C9 8D 7D BC lea edi,[ebp-44h]
0040B7CC B9 11 00 00 00 mov ecx,11h
0040B7D1 B8 CC CC CC CC mov eax,0cccccccccccccch
040 b 7d6F3 abrepstosdwordptr [ EDI ]
*/
esp -=4; 为了保存//ebp的值,按下ebp的值
esp -=68; //为局部变量准备44h的空间
esp -=4; 按下//EBX的值
esp -=4; 按下//ESI的值
esp -=4; 按下//EDI的值
返回esp;
}
是intesp(inta )
{
int k;
_asm
{
mov k,esp
}
printf(espinesp=x(n ),k );
返回0;
}
Void主() )
{
int k;
int ret;
__asm
{
mov k,esp
}
printf(espinmain=x(n ),k );
ret=virtualesp(k;
printf(ESPinvirtualesp=x(n ),ret );
//esp(100; 仅用于说明具有与virtualesp相同的参数
ESP(100;
}
//调试版编译结果
/*
esp in main=0012ff2c
esp in virtualesp=0012fed0
esp in esp=0012fed0
*/
//注意:发行版的结果不同,可能是VC优化的结果