//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 ,你除了可以发表评论外,还可以转载 “堆栈传参实验” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!! (尊重他人劳动,你我共同努力)
呵呵,谢谢
VaTG790i.最好的<a href=http://www.kyfei.com>网站推广软件</a>,
非常好
....................
;ui;普i;uighur;ui;ui;个
在unix网络编程中看到了关于TCP/IP的一些内容,我感觉还是写的不够。正在下载中,一定
下载地址呢