C++函数如何操作堆栈指针esp
2008-03-08 12:24:45 来源:WEB开发网核心提示:有点好奇,所以跟踪 esp 的变化情况,C++函数如何操作堆栈指针esp,不知这样理解对不对,好不好?// 本人初学,希望可以和大家交流一下,你怎么理解的?// 编译环境 WIN XP sp2// vc 6.0// e-mail: shoow@126.com#include
有点好奇,所以跟踪 esp 的变化情况,不知这样理解对不对,好不好?
// 本人初学,希望可以和大家交流一下,你怎么理解的?
// 编译环境 WIN XP sp2
// vc 6.0
// e-mail: shoow@126.com
#include
int k;
void __declspec(naked) test()
{
__asm
{
push ebp
mov k, esp
mov ebp, esp
}
__asm
{
jmp exit
push k
push aa
call PRintf
add esp, 4*2
}
__asm
{
exit:
push k
push aa
call printf
add esp, 44h
mov esp, ebp
pop ebp
ret
}
}
int virtualesp(int _esp)
{
/*
push _esp
call virtualesp
*/
// 保存函数调用前 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
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,0CCCCCCCCh
0040B7D6 F3 AB rep stos dWord ptr [edi]
*/
esp -= 4; // 压入 ebp 的值,用来保存 ebp 的值
esp -= 68; // 为局部变量预备 44h 的空间
esp -= 4; // 压入 ebx 的值
esp -= 4; // 压入 esi 的值
esp -= 4; // 压入 edi 的值
return esp;
}
int esp(int a)
{
int k;
_asm
{
mov k, esp
}
printf("esp in esp = %08x\n", k);
return 0;
}
void main()
{
int k;
int ret;
__asm
{
mov k, esp
}
printf("esp in main = %08x\n", k);
ret = virtualesp(k);
printf("esp in virtualesp = %08x\n", ret);
// esp(100);只是用来说明与virtualesp有相同的参数
esp(100);
}
// Debug版编译结果
/*
esp in main = 0012ff2c
esp in virtualesp = 0012fed0
esp in esp = 0012fed0
*/
// 注重:Release版的结果不一样,可能是VC优化的结果吧进入讨论组讨论。
更多精彩
赞助商链接
