您的位置:首页 > 其它

传递指针的引用与传递指针的区别 反汇编

2011-01-15 07:32 387 查看
小菜不懂反汇编。。本文是 copy 过来的。。study study 。。

参数传递指针时将直接对指针指向的地址进行操作

传递指针的引用时,通过间接寻址,来实现对[指针指向的地址]进行操作。


看看下面一段程序反汇编后的内容就很清楚了



#include   <iostream>
using   namespace   std;
void   f1(int   *&a)
{
        int   *b;
        b=a;
}
void   f2(int   *a)
{
        int   *b;
        b=a;
}
void   main()
{
        int   m=10;
        int   *n=&m;
        f1(n);
        f2(n);
}


*   Referenced   by   a   CALL   at   Address:
|:00401187      
|
:00401150   55                                             push   ebp
:00401151   8BEC                                         mov   ebp,   esp
:00401153   51                                             push   ecx
//[ebp+08]即为压栈内容:n的有效地址
:00401154   8B4508                                     mov   eax,   dword   ptr   [ebp+08]
//取得主函数中m的有效地址--》edx
:00401157   8B10                                         mov   edx,   dword   ptr   [eax]
//b=a;
:00401159   8955FC                                     mov   dword   ptr   [ebp-04],   edx
:0040115C   59                                             pop   ecx
:0040115D   5D                                             pop   ebp
:0040115E   C3                                             ret
*   Referenced   by   a   CALL   at   Address:
|:00401190      
|
:00401160   55                                             push   ebp
:00401161   8BEC                                         mov   ebp,   esp
:00401163   51                                             push   ecx
//取得压栈内容:n的有效内容(即m的有效地址)
:00401164   8B4508                                     mov   eax,   dword   ptr   [ebp+08]
//b=a;
:00401167   8945FC                                     mov   dword   ptr   [ebp-04],   eax
:0040116A   59                                             pop   ecx
:0040116B   5D                                             pop   ebp
:0040116C   C3                                             ret
---------------> 函数开始 <----------------------------
:00401170   55                                             push   ebp
:00401171   8BEC                                         mov   ebp,   esp
:00401173   83C4F8                                     add   esp,   FFFFFFF8
int   m=10;
:00401176   C745FC0A000000                     mov   [ebp-04],   0000000A
int   *n=&m;
:0040117D   8D45FC                                     lea   eax,   dword   ptr   [ebp-04]
:00401180   8945F8                                     mov   dword   ptr   [ebp-08],   eax
f1(n);
//由于形参是引用变量,所以将n的有效地址压栈
:00401183   8D55F8                                     lea   edx,   dword   ptr   [ebp-08]
:00401186   52                                             push   edx
:00401187   E8C4FFFFFF                             call   00401150
:0040118C   59                                             pop   ecx
f2(n);
//由于形参是指针变量,所以将n的有效内容压栈(即m的有效地址)
:0040118D   FF75F8                                     push   [ebp-08]
:00401190   E8CBFFFFFF                             call   00401160
:00401195   59                                             pop   ecx
:00401196   59                                             pop   ecx
:00401197   59                                             pop   ecx
:00401198   5D                                             pop   ebp
:00401199   C3                                             ret
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: