2 #include <cstdio>
3 using namespace std;
4
5 int main()
6 {
7 double obj = 3.14;
8 double *pd = &obj;
9
10 void *pv = &obj;
11 pv = pd;
12
13 int a = 5;
14 int *ip = &a;
15 int *pa = 0;
16 pa = ip;
17 *pa = *ip;
18
19 return 0;
20 }
下面的代码是在VC++6.0调试时候查看反汇编的显示结果,重点看红颜色的标记代码和相应解释
1 1: #include <iostream>
22: #include <cstdio>
33: using namespace std;
44:
55: int main()
66: {
70040103055push ebp
800401031 8B EC mov ebp,esp
90040103383 EC 5C sub esp,5Ch
100040103653push ebx
110040103756push esi
120040103857push edi
1300401039 8D 7D A4 lea edi,[ebp-5Ch]
140040103C B9 17000000 mov ecx,17h
1500401041 B8 CC CC CC CC mov eax,0CCCCCCCCh
1600401046 F3 AB rep stos dword ptr [edi]
177: double obj = 3.14;
1800401048 C7 45 F8 1F 85 EB 51 mov dword ptr [ebp-8],51EB851Fh
190040104F C7 45 FC B8 1E 0940 mov dword ptr [ebp-4],40091EB8h
208: double *pd = &obj;
2100401056 8D 45 F8 lea eax,[ebp-8]
22004010598945 F4 mov dword ptr [ebp-0Ch],eax
239:
2410: void *pv = &obj;
250040105C 8D 4D F8 lea ecx,[ebp-8]
260040105F89 4D F0 mov dword ptr [ebp-10h],ecx
2711: pv = pd;
2800401062 8B 55 F4 mov edx,dword ptr [ebp-0Ch]
29004010658955 F0 mov dword ptr [ebp-10h],edx
3012:
3113: int a = 5;
3200401068 C7 45 EC 05000000 mov dword ptr [ebp-14h],5 ;对于整型的赋值却是一条指令可以解决
3314: int *ip = &a;
340040106F 8D 45 EC lea eax,[ebp-14h]
35004010728945 E8 mov dword ptr [ebp-18h],eax
3615: int *pa = 0;
3700401075 C7 45 E4 00000000 mov dword ptr [ebp-1Ch],0 [ebp-1Ch]
指向指针pa,这里应该对局部变量的存取有一定的了解。
3816: pa = ip;
390040107C 8B 4D E8 mov ecx,dword ptr [ebp-18h]
400040107F89 4D E4 mov dword ptr [ebp-1Ch],ecx
4117: *pa = *ip;
4200401082 8B 55 E4 mov edx,dword ptr [ebp-1Ch]
4300401085 8B 45 E8 mov eax,dword ptr [ebp-18h]
4400401088 8B 08 mov ecx,dword ptr [eax]
450040108A890A mov dword ptr [edx],ecx
这里就是重点了。对于指针的解引用操作符,实现过程是先将ip所指的地址存储到一个寄存器中(eax),对指针pa的操作 ;也是如此。然后再对[eax]中的内容进行复制到ecx寄存器中,然后再将ecx的内容传送给[edx]寄存器中,即把指针ip所指的对象的值赋值给*pa
4618:
4719: return 0;
480040108C33 C0 xor eax,eax
4920: }
500040108E 5F pop edi
510040108F 5E pop esi
5200401090 5B pop ebx
5300401091 8B E5 mov esp,ebp
5400401093 5D pop ebp
5500401094 C3 ret