// 有点好奇,所以跟踪 esp 的变化情况,不知这样理解对不对,好不好?
// 本人初学,希望可以和大家交流一下,你怎么理解的?
// 编译环境 WIN XP sp2
// vc 6.0
// e-mail: dengbin520@gmail.com
#include <stdio.h>
char *aa = "esp in test = %08x/n";
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
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,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优化的结果吧
分享到:
相关推荐
C++ 获取函数调用堆栈的 高效实现代码
C/C++ 函数指针的意义,函数指针的用法
C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。
c++的高级应用,c++函数数组指针的使用方法。在使用中大大缩短了我的代码量,感觉不错的方法
1.普通函数指针指向普通函数 2.普通函数指向非静态成员函数 3. 类外部的 类函数指针 指向普通函数 4. 类外部的 类函数指针 指向成员函数 5. 类内部的 函数指针 指向成员函数 (类似于第2条) 6. 类内部的 函数指针 ...
指针 不仅可以只想变量 常量 数组 还可以指向函数 。 本资源利用函数指针调用 求和函数
C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数
定义指向函数的指针,这种指针可以被赋值...
c++的指针特性学习之函数指针,代码中给出了函数指针的声明方式和使用方式,供大家使用函数指针参考
里面包含: 普通函数指针,同一个类函数指针,不同类的函数指针的使用。
一个C++函数速查的工具 chm格式 C++函数速查的工具 chm格式
c++中的函数指针介绍,c++入门知识,详细的介绍了函数指针的定义方法和用法
C++编程语言中函数指针常见用法:函数调用及回调函数中的使用。
其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有...
英文的。 C/C++ 函数指针教程 C/C++ 函数指针教程 C/C++ 函数指针教程
C/C++函数手册收集了几乎所有C、C++常用的函数,便于查询
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的...
关于函数指针的理解,是C++中的一个知识点 初学者很容易范一些错误。 本文给了一个解释。
通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数
里面包含函数和指针概念的详细讲解,北大名师所做。希望能够对学C/C++的同学有所帮助。