老钟古

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
下面是程序实现的源代码, 

 

 1 #include <iostream>
 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

 


 
posted on 2011-02-26 09:21  老钟古  阅读(3998)  评论(0编辑  收藏  举报