首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于C++对象作为返回值汇编代码的有关问题

2013-02-17 
关于C++对象作为返回值汇编代码的问题C++代码如下:class CReturn{public:int m_nNumber}CReturn GetRetu

关于C++对象作为返回值汇编代码的问题
C++代码如下:


class CReturn
{
public:
    int m_nNumber;
};

CReturn GetReturn()
{
    CReturn RetObj;
    RetObj.m_nNumber = 0;
    return RetObj;
}

int main(int argc, char* argv[])
{
    CReturn objA;
objA = GetReturn();
return 0;
}

其中main函数中的汇编代码如下:

29:       CReturn objA;
30:       objA = GetReturn();
004010BE   lea         eax,[ebp-84h] // 返回对象的栈空间首地址
004010C4   push        eax // 将返回对象的首地址压入栈中,用于保存返回对象的数据
004010C5   call        @ILT+0(GetReturn) (00401005)
004010CA   add         esp,4
004010CD   mov         esi,eax // 取出返回对象首址
004010CF   mov         ecx,0Bh
004010D4   lea         edi,[ebp-58h]
004010D7   rep movs    dword ptr [edi],dword ptr [esi] // 将返回对象放入ebp-58h栈空间中
004010D9   mov         ecx,0Bh
004010DE   lea         esi,[ebp-58h]
004010E1   lea         edi,[ebp-2Ch] // ebp-2Ch即局变量objA的地址
004010E4   rep movs    dword ptr [edi],dword ptr [esi]
31:       return 0;
004010E6   xor         eax,eax


第3行已经用一个栈空间ebp-84h接收GetReturn返回的对象,为什么需要第7到10行再进行一次复制到ebp-58h栈空间里面,
然后再从栈空间ebp-58h再到栈空间ebp-2Ch(也就是局部变量objA),为什么不直接从ebp-84h到ebp-2Ch呢?
望大家不吝赐教!
GetReturn函数汇编代码如下:

16:       CReturn RetObj;
17:
18:       RetObj.m_nNumber = 0;
00401038   mov         dword ptr [ebp-2Ch],0
19:       for (int i = 0; i < 10; i++)
0040103F   mov         dword ptr [ebp-30h],0
00401046   jmp         GetReturn+31h (00401051)
00401048   mov         eax,dword ptr [ebp-30h]
0040104B   add         eax,1
0040104E   mov         dword ptr [ebp-30h],eax
00401051   cmp         dword ptr [ebp-30h],0Ah
00401055   jge         GetReturn+46h (00401066)
20:       {
21:           RetObj.m_nArray[i] = i + 1;
00401057   mov         ecx,dword ptr [ebp-30h]


0040105A   add         ecx,1
0040105D   mov         edx,dword ptr [ebp-30h]
00401060   mov         dword ptr [ebp+edx*4-28h],ecx
22:       }
00401064   jmp         GetReturn+28h (00401048)
23:
24:       return RetObj;
00401066   mov         ecx,0Bh
0040106B   lea         esi,[ebp-2Ch]
0040106E   mov         edi,dword ptr [ebp+8] // 这里的ebp+8即main函数中的ebp-84h
00401071   rep movs    dword ptr [edi],dword ptr [esi]
00401073   mov         eax,dword ptr [ebp+8] // 将返回对象首地址放入eax中
25:   }



什么都没有!
[解决办法]
你把你的CReturn类改成这样的
class CReturn
{
public:
   CReturn(){printf("CReturn()...\n");memset(m_Array,0,sizeof(m_Array));}
   ~CReturn(){printf("~CReturn()...\n");}
   int m_nNumber;
   int m_Array[20];
};

热点排行