关于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];
};