- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
楼主 |
发表于 2010-2-2 13:08:08
|
显示全部楼层
38: tt = GetData(30);
0040E9E8 push 1Eh
0040E9EA lea eax,[ebp-20h] // 把返回对象的地址压入堆栈
0040E9ED push eax
0040E9EE call @ILT+30(GetData) (00401023) //
0040E9F3 add esp,8
0040E9F6 mov dword ptr [ebp-2Ch],eax // 返回的临时对象
0040E9F9 mov ecx,dword ptr [ebp-2Ch] // 开始按位COPY
0040E9FC mov edx,dword ptr [ecx]
0040E9FE mov eax,dword ptr [ecx+4]
0040EA01 mov dword ptr [ebp-14h],edx
0040EA04 mov dword ptr [ebp-10h],eax // Copy 函数结束
0040EA07 lea ecx,[ebp-20h]
0040EA0A call @ILT+10(Test::~Test) (0040100f)
// 编译器的编译原则(申请空间)
// 把函数当返回值来看待 以决定该变量所需要的空间
// 若返回值为对象 则压入的参数个数 + 1
call @ILT+30(GetData) (00401023)
{
29: Test temp(nData);
004010E4 mov eax,dword ptr [ebp+0Ch]
004010E7 push eax
004010E8 lea ecx,[ebp-14h] // 局部变量的空间
004010EB call @ILT+0(Test::Test) (00401005)
30: return temp;
004010F0 mov ecx,dword ptr [ebp+8] // 参数
004010F3 mov edx,dword ptr [ebp-14h] // 赋值(续表)
004010F6 mov dword ptr [ecx],edx // 赋值(m_nData)
004010F8 mov eax,dword ptr [ebp-10h]
004010FB mov dword ptr [ecx+4],eax
004010FE mov ecx,dword ptr [ebp-18h]
00401101 or ecx,1
00401104 mov dword ptr [ebp-18h],ecx
00401107 lea ecx,[ebp-14h]
0040110A call @ILT+10(Test::~Test) (0040100f) // 赋值OVER后 析构掉函数内部的局部对象)
0040110F mov eax,dword ptr [ebp+8]
31: } |
|