反汇编系列(一) 基本函数调用

#include"stdio.h"
int function(int a,int b)
{
    int c=a+b;
    return c;
}
void main()
{
    function(1,2);
    getchar();
} 



--- c:\users\wangchao\desktop\test\test\main.cpp -------------------------------
#include "stdio.h"
int function(int a,int b)
{
00C213A0 push ebp
00C213A1 mov ebp,esp
;注意:下面ebp并无改变

00C213A3 sub esp,0CCh                 ;空出一片栈空间用来存储局部变量,本函数内部使用

00C213A9 push ebx                     ;esp-4
00C213AA push esi                     ;esp-4
00C213AB push edi                     ;esp-4
;写es断点调试,因为临时变量区没有代码,大小为0cch
00C213AC lea edi,[ebp-0CCh]          
00C213B2 mov ecx,33h
00C213B7 mov eax,0CCCCCCCCh
00C213BC rep stos dword ptr es:[edi]   ;es段edi位置正好是本函数使用开始使用的栈起始地址。
;int c= a+b;
00C213BE mov eax,dword ptr [a]         ;mov eax,[ebp+8] 参数1即a   为什么加8,因为前面压入了8字节分别为main做的压入EIP和前面的Push ebp
00C213C1 add eax,dword ptr [b]         ;add eax,[ebp+0ch] 参数2即b ebp里的值始终是esp原值
00C213C4 mov dword ptr [c],eax
;return c;
00C213C7 mov eax,dword ptr [c]         ;eax始终用来存放返回值
}
00C213CA pop edi
00C213CB pop esi
00C213CC pop ebx

00C213CD mov esp,ebp
00C213CF pop ebp
00C213D0 ret
--- c:\users\wangchao\desktop\test\test\main.cpp -------------------------------
void main()
{
00C213E0 push ebp
00C213E1 mov ebp,esp
00C213E3 sub esp,0C0h
00C213E9 push ebx
00C213EA push esi
00C213EB push edi
00C213EC lea edi,[ebp-0C0h]
00C213F2 mov ecx,30h
00C213F7 mov eax,0CCCCCCCCh
00C213FC rep stos dword ptr es:[edi]
;function(1,2);
00C213FE push 2
00C21400 push 1
00C21402 call function (0C210E6h)
00C21407 add esp,8
;getchar();
00C2140A mov esi,esp
00C2140C call dword ptr [__imp__getchar (0C282B4h)]
00C21412 cmp esi,esp
00C21414 call @ILT+315(__RTC_CheckEsp) (0C21140h)
}
00C21419 xor eax,eax
00C2141B pop edi
00C2141C pop esi
00C2141D pop ebx
00C2141E add esp,0C0h
00C21424 cmp ebp,esp
00C21426 call @ILT+315(__RTC_CheckEsp) (0C21140h)
00C2142B mov esp,ebp
00C2142D pop ebp
00C2142E ret

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值