|
本帖最后由 gmh5225 于 2014-12-28 23:15 编辑
写这个纯属就是自己记录下自己的学习经历,没有其他的意思。
详细命令请百度谷歌 8086汇编指令
继上几次C函数的调用方式 (1) __cdecl (2) __stacall (3) __fastcall
这次是C++的,多了一个类的自身对象 thiscall
thiscall会隐含一个this参数,在执行call前会给ecx
原型:
- class Mythiscall
- {
- public:
- int add(int,int);
- };
- int Mythiscall::add(int a,int b)
- {
- return a+b;
- }
- int main()
- {
- Mythiscall t;
- int a=3,b=4,c=0;
- c=t.add(a,b);
- printf("%d",c);
- system("pause");
- return 0;
- }
复制代码 反汇编:
- 0128103E 50 push eax
- 0128103F 8B4D FC mov ecx, dword ptr [ebp-0x4]
- 01281042 51 push ecx
- 01281043 8D4D F3 lea ecx, dword ptr [ebp-0xD] ; 传递一个隐藏的this参数,赋值给ecx
- 01281046 E8 B5FFFFFF call testtest.Mythiscall::add
复制代码
而加法函数内部:
- 01281000 > 55 push ebp
- 01281001 8BEC mov ebp, esp
- 01281003 51 push ecx
- 01281004 894D FC mov dword ptr [ebp-0x4], ecx this参数赋值给第一个局部变量
- 01281007 8B45 08 mov eax, dword ptr [ebp+0x8]
- 0128100A 0345 0C add eax, dword ptr [ebp+0xC]
- 0128100D 8BE5 mov esp, ebp
- 0128100F 5D pop ebp
- 01281010 > C2 0800 retn 0x8
复制代码 上面的讲完了,那么就讲C++的核心,面向对象,类,那类里面又属什么是核心呢,那就是虚函数了。
先看C++源代码:
- class Myfun
- {
- public:
- virtual int add(int a,int b)
- {
- return a+b;
- }
- virtual int mul(int a,int b)
- {
- return a*b;
- }
- };
- int main()
- {
- Myfun *m=new Myfun();
- m->add(2,3);
- m->mul(2,3);
- return 0;
- }
复制代码
OD反汇编:
- 00CD1040 >/[ DISCUZ_CODE_21 ]nbsp; 55 push ebp
- 00CD1041 |. 8BEC mov ebp, esp
- 00CD1043 |. 83EC 0C sub esp, 0xC
- 00CD1046 |. 6A 04 push 0x4 ; 为新指针m分配空间
- 00CD1048 |. FF15 A820CD00 call dword ptr [<&MSVCR100.operator new>] ; msvcr100.operator new
- 00CD104E |. 83C4 04 add esp, 0x4
- 00CD1051 |. 8945 F8 mov dword ptr [ebp-0x8], eax ; new一个指针
- 00CD1054 |. 837D F8 00 cmp dword ptr [ebp-0x8], 0x0
- 00CD1058 |. 74 0D je short testtest.00CD1067 ; 判断指针是否为空
- 00CD105A |. 8B4D F8 mov ecx, dword ptr [ebp-0x8]
- 00CD105D |. E8 3E000000 call testtest.Myfun::Myfun ; 指针指向Myfun类
- 00CD1062 |. 8945 F4 mov dword ptr [ebp-0xC], eax ; 返回的eax指针
- 00CD1065 |. EB 07 jmp short testtest.00CD106E
- 00CD1067 |> C745 F4 00000>mov dword ptr [ebp-0xC], 0x0
- 00CD106E |> 8B45 F4 mov eax, dword ptr [ebp-0xC]
- 00CD1071 |. 8945 FC mov dword ptr [ebp-0x4], eax
- 00CD1074 |. 6A 03 push 0x3 ; 压3
- 00CD1076 |. 6A 02 push 0x2 ; 压2
- 00CD1078 |. 8B4D FC mov ecx, dword ptr [ebp-0x4] ; this指针 传入ecx
- 00CD107B |. 8B11 mov edx, dword ptr [ecx] ; this指针指向虚函数
- 00CD107D |. 8B4D FC mov ecx, dword ptr [ebp-0x4]
- 00CD1080 |. 8B02 mov eax, dword ptr [edx] ; 虚函数指针指向add函数
- 00CD1082 |. FFD0 call eax ; 调用add函数
- 00CD1084 |. 6A 03 push 0x3 ; 压3
- 00CD1086 |. 6A 02 push 0x2 ; 压2
- 00CD1088 |. 8B4D FC mov ecx, dword ptr [ebp-0x4] ; this指针 传入ecx
- 00CD108B |. 8B11 mov edx, dword ptr [ecx] ; this指针指向虚函数
- 00CD108D |. 8B4D FC mov ecx, dword ptr [ebp-0x4]
- 00CD1090 |. 8B42 04 mov eax, dword ptr [edx+0x4] ; 虚函数指针指向mul函数
- 00CD1093 |. FFD0 call eax ; 调用mul函数
- 00CD1095 |. 33C0 xor eax, eax
- 00CD1097 |. 8BE5 mov esp, ebp
- 00CD1099 |. 5D pop ebp
- 00CD109A \. C3 retn
复制代码 add函数内部
- 00CD1000 >/. 55 push ebp
- 00CD1001 |. 8BEC mov ebp, esp
- 00CD1003 |. 51 push ecx
- 00CD1004 |. 894D FC mov dword ptr [ebp-0x4], ecx ; this指针
- 00CD1007 |. 8B45 08 mov eax, dword ptr [ebp+0x8] ; 参数1
- 00CD100A |. 0345 0C add eax, dword ptr [ebp+0xC] ; 参数2
- 00CD100D |. 8BE5 mov esp, ebp
- 00CD100F |. 5D pop ebp
- 00CD1010 \. C2 0800 retn 0x8
复制代码 mul函数内部
- 00CD1020 >/. 55 push ebp
- 00CD1021 |. 8BEC mov ebp, esp
- 00CD1023 |. 51 push ecx
- 00CD1024 |. 894D FC mov dword ptr [ebp-0x4], ecx ; this指针
- 00CD1027 |. 8B45 08 mov eax, dword ptr [ebp+0x8] ; 参数1
- 00CD102A |. 0FAF45 0C imul eax, dword ptr [ebp+0xC] ; 参数2
- 00CD102E |. 8BE5 mov esp, ebp
- 00CD1030 |. 5D pop ebp
- 00CD1031 \. C2 0800 retn 0x8
复制代码
我们发现,调用虚函数的时候,是用了2级指针去访问的,第一级指针是this指针,第二级是虚函数指针,然后再用虚函数指针去访问相应的函数
|
评分
-
参与人数 27 | HB +47 |
THX +22 |
收起
理由
|
动动
| |
+ 1 |
|
24567
| |
+ 1 |
|
一路走来不容易
| + 1 |
|
|
temp
| + 1 |
|
|
消逝的过去
| |
+ 1 |
|
ldljlzw
| |
+ 1 |
|
weiran324
| + 1 |
|
[吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩! |
MoeRay
| + 1 |
|
|
jaunic
| |
+ 1 |
|
hnymsh
| |
+ 1 |
|
lies
| + 1 |
|
|
轻轻不语
| + 3 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
jolly_800
| + 1 |
+ 1 |
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! |
y123y45
| + 1 |
+ 1 |
好人有好报!你的热心我永远不忘!谢谢! |
ningzhonghui
| + 3 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
Cyan
| + 1 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
逍遥枷锁
| + 2 |
+ 1 |
好人有好报!你的热心我永远不忘!谢谢! |
vipcrack
| + 4 |
+ 1 |
论坛有你更精彩!感谢楼主! |
Scar-疤痕
| + 4 |
+ 1 |
论坛有你更精彩!感谢楼主! |
Desire
| + 3 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
Mrsin
| + 3 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
Top丶邪少
| + 5 |
+ 1 |
大型连续剧,1400集! |
奥特曼
| + 1 |
+ 1 |
恒大说“评分不扣自己的分”!! |
狮子
| + 1 |
+ 1 |
祝楼主桃花运天天都有,哈哈! |
雨季
| + 3 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品!!. |
神秘小子
| + 2 |
+ 1 |
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! |
Shark恒
| + 5 |
+ 1 |
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! |
查看全部评分
|