当前位置: 主页 > 日志 > C/C++ >

堆栈传参实验

//c程序
int add(int a,int b)
{
    return a+b;
}
int main()
{
    int c;
    c=add(1,2);
    return 0;
}

//对应的汇编代码
1:    int add(int a,int b)
2:    {
00401010 55                   push        ebp
00401011 8B EC                mov         ebp,esp
00401013 83 EC 40             sub         esp,40h
00401016 53                   push        ebx
00401017 56                   push        esi
00401018 57                   push        edi
00401019 8D 7D C0             lea         edi,[ebp-40h]
0040101C B9 10 00 00 00       mov         ecx,10h
00401021 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401026 F3 AB                rep stos    dword ptr [edi]
3:        return a+b;
00401028 8B 45 08             mov         eax,dword ptr [ebp+8];将参数"1"放入eax(参数2,参数1,eip)
0040102B 03 45 0C             add         eax,dword ptr [ebp+0Ch];将参数"2"放入eax
4:    }
0040102E 5F                   pop         edi
0040102F 5E                   pop         esi
00401030 5B                   pop         ebx
00401031 8B E5                mov         esp,ebp
00401033 5D                   pop         ebp
00401034 C3                   ret;相当于pop eip


5:    int main()
6:    {
0040D460 55                   push        ebp
0040D461 8B EC                mov         ebp,esp
0040D463 83 EC 44             sub         esp,44h
0040D466 53                   push        ebx
0040D467 56                   push        esi
0040D468 57                   push        edi
0040D469 8D 7D BC             lea         edi,[ebp-44h]
0040D46C B9 11 00 00 00       mov         ecx,11h
0040D471 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
0040D476 F3 AB                rep stos    dword ptr [edi]
7:        int c;
8:        c=add(1,2);
0040D478 6A 02                push        2;从右向左压入参数
0040D47A 6A 01                push        1
0040D47C E8 89 3B FF FF       call        @ILT+5(_add) (0040100a);等价于push eip和jmp 0040100a
0040D481 83 C4 08             add         esp,8;函数调用完毕恢复栈顶指针(两个int型参数占去了8个字节)
0040D484 89 45 FC             mov         dword ptr [ebp-4],eax;将函数返回结果保存到c中(函数已将运算结果保存于eax)
9:        return 0;
0040D487 33 C0                xor         eax,eax
10:   }
0040D489 5F                   pop         edi
0040D48A 5E                   pop         esi
0040D48B 5B                   pop         ebx
0040D48C 83 C4 44             add         esp,44h
0040D48F 3B EC                cmp         ebp,esp
0040D491 E8 DA 3B FF FF       call        __chkesp (00401070)
0040D496 8B E5                mov         esp,ebp;恢复栈顶指针
0040D498 5D                   pop         ebp;恢复ebp
0040D499 C3                   ret;等价于pop eip(栈顶指针esp减4),接下来程序将执行eip处代码

[日志信息]

该日志于 2009-02-26 15:22 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “堆栈传参实验” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部