从汇编学习c++ 之 类的方法调用
来源:互联网 发布:忙与闲 知乎 编辑:程序博客网 时间:2024/06/03 05:55
src(debug vesion by vs2008 sp1 on xp sp3)
#include<iostream>using namespace std;class SimpleClass{public: int x; void HelloWorld(){ printf("hello,mao"); }};int main(int argc,char **argv){ SimpleClass myclass; myclass.HelloWorld(); return 0;}
反汇编后的结构
--- c:\vc6\myprojects\vsclasstest\vsclasstest\bingome.cpp ---------------------- 1: #include<iostream> 2: using namespace std; 3: 4: class SimpleClass{ 5: public: 6: int x; 7: void HelloWorld(){00411440 push ebp 00411441 mov ebp,esp 00411443 sub esp,0CCh 00411449 push ebx 0041144A push esi 0041144B push edi 0041144C push ecx 0041144D lea edi,[ebp-0CCh] 00411453 mov ecx,33h 00411458 mov eax,0CCCCCCCCh 0041145D rep stos dword ptr es:[edi] //将局部变量空间全部初始化为0xcc (0x33*4=CC)(store to string addr edi by dword,repeat time is ecx,filled-word is eax.)0041145F pop ecx 00411460 mov dword ptr [ebp-8],ecx //ebp-8处是个变量,存放当前类实例的地址,那么,我们的x去了哪里呢。---类中的变量不是函数中的局部变量,方法栈空间大小和类成员数目没有关系。 8: printf("hello,mao");00411463 mov esi,esp 00411465 push offset string "hello,mao" (415800h) 0041146A call dword ptr [__imp__printf (4182BCh)] //从导入表中获得地址,导入表iat在4182BCh处00411470 add esp,4 00411473 cmp esi,esp 00411475 call @ILT+310(__RTC_CheckEsp) (41113Bh) 9: }0041147A pop edi 0041147B pop esi 0041147C pop ebx 0041147D add esp,0CCh 00411483 cmp ebp,esp 00411485 call @ILT+310(__RTC_CheckEsp) (41113Bh) 0041148A mov esp,ebp 0041148C pop ebp 0041148D ret
main函数部分
17: SimpleClass myclass;18: myclass.HelloWorld(); 004113CE lea ecx,[myclass] 004113D1 callSimpleClass::HelloWorld (41114Ah) 19: return 0; 004113D6 xor eax,eax
从图中可以看出来,执行类中方法的时候,会先取出实例化类的地址(ecx= myclass
),也就是说编译器让类的内部方法实现的时候已经引入了隐藏变量实例化的类指针
。
类中的变量不是类方法中的变量,类方法访问类中变量是通过ecx作为隐藏参数传入的,所以类方法中没有分配空间存放类成员。
0 0
- 从汇编学习c++ 之 类的方法调用
- C/C++与汇编语言的交互之-(2)从C/C++代码调用汇编代码中的函数与变量
- 从汇编看c语言函数调用
- 从汇编看c语言函数调用
- 从汇编的眼光看C++(之指针拷贝)
- 从汇编的眼光看C++(之指针拷贝)
- 从汇编的眼光看C++(之指针拷贝)
- 从汇编的眼光看C++(之递归函数与模板类)
- 从汇编的眼光看C++(之递归函数与模板类)
- 从汇编的眼光看C++(之递归函数与模板类)
- 从汇编的眼光看C++(之递归函数与模板类)
- 从汇编角度看Linux C函数的调用约定和参数传递的细节
- ARM汇编冒泡排序之c语言调用汇编
- ARM汇编冒泡排序之汇编调用c语言
- Lua学习笔记三之从Lua中调用C
- linux汇编学习(-)之从键盘输入输出
- 从汇编的眼光看C++(之递归函数与模板类) ,(之泛型编程) .
- keilC中c程序调用汇编的方法(流水灯C程序)
- 黑马程序员——[oc]核心语法1
- DNS原理及其解析过程
- mysql的表分区技术
- IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法
- [LeetCode] Remove Nth Node From End of List
- 从汇编学习c++ 之 类的方法调用
- 添加远程库
- CSU 1581Clock Pictures Hash
- ONOS Blackbird性能评估
- SQLite实例——dummynote(记事本)
- Windows Tinyxml读取xml文件小结
- Firefox及Chrome访问Https类型Web站点报错
- (struts2) spring mvc + mybatis + maven整合
- ZOJ 1610