返回值为对象的函数识别

调用部分:

    CReturn Return;
    Return = GetCReturn();
004077A7 8D 85 70 FF FF FF    lea         eax,[ebp-90h]          ;返回的对象的栈空间首地址
004077AD 50                   push        eax  
004077AE E8 68 A5 FF FF       call        GetCReturn (0401D1Bh)  ;调用函数 先到跳转表 再跳过去
004077B3 83 C4 04             add         esp,4  

;先把返回的对象放到临时空间中
004077B6 B9 0B 00 00 00       mov         ecx,0Bh  
004077BB 8B F0                mov         esi,eax  
004077BD 8D 7D 9C             lea         edi,[ebp-64h]  
004077C0 F3 A5                rep movs    dword ptr es:[edi],dword ptr [esi]  

;再把临时空间中的数据传给结果 为什么要多此一举呢 可能是因为没有开优化吧 
004077C2 B9 0B 00 00 00       mov         ecx,0Bh  
004077C7 8D 75 9C             lea         esi,[ebp-64h]  
004077CA 8D 7D CC             lea         edi,[Return]  
004077CD F3 A5                rep movs    dword ptr es:[edi],dword ptr [esi]  

函数主体:

CReturn GetCReturn()
{
004076B0 55                   push        ebp  
004076B1 8B EC                mov         ebp,esp  
004076B3 83 EC 3C             sub         esp,3Ch  
004076B6 56                   push        esi  
004076B7 57                   push        edi  
004076B8 8D 7D C4             lea         edi,[ebp-3Ch]  
;security_cookie机制
004076BB B9 0F 00 00 00       mov         ecx,0Fh  
004076C0 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
004076C5 F3 AB                rep stos    dword ptr es:[edi]  
004076C7 A1 08 C0 4B 00       mov         eax,dword ptr [__security_cookie (04BC008h)]  
004076CC 33 C5                xor         eax,ebp  
004076CE 89 45 FC             mov         dword ptr [ebp-4],eax  

    CReturn Return ;
    Return.m_nNumber = 0;
004076D1 C7 45 CC 00 00 00 00 mov         dword ptr [Return],0  
    for (int i = 0; i < 10; i++)
004076D8 C7 45 C4 00 00 00 00 mov         dword ptr [ebp-3Ch],0  
004076DF EB 09                jmp         GetCReturn+3Ah (04076EAh)  
004076E1 8B 45 C4             mov         eax,dword ptr [ebp-3Ch]  
    for (int i = 0; i < 10; i++)
004076E4 83 C0 01             add         eax,1  
004076E7 89 45 C4             mov         dword ptr [ebp-3Ch],eax  
004076EA 83 7D C4 0A          cmp         dword ptr [ebp-3Ch],0Ah  
004076EE 7D 0F                jge         GetCReturn+4Fh (04076FFh)  
    {
        Return.m_nArry[i] = i+1;
004076F0 8B 4D C4             mov         ecx,dword ptr [ebp-3Ch]  
004076F3 83 C1 01             add         ecx,1  
004076F6 8B 55 C4             mov         edx,dword ptr [ebp-3Ch]  
004076F9 89 4C 95 D0          mov         dword ptr [ebp+edx*4-30h],ecx  
    }
004076FD EB E2                jmp         GetCReturn+31h (04076E1h)  
    return Return;
004076FF B9 0B 00 00 00       mov         ecx,0Bh  
00407704 8D 75 CC             lea         esi,[Return]  ;局部对象首地址
00407707 8B 7D 08             mov         edi,dword ptr [ebp+8]  ;返回对象首地址
;把局部对象赋给返回对象中
0040770A F3 A5                rep movs    dword ptr es:[edi],dword ptr [esi]  
0040770C 8B 45 08             mov         eax,dword ptr [ebp+8]  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值