C语言main方法的汇编,c语言最简main函数的反汇编代码解析(3页)-原创力文档

目前我们写的最简单的Main函数如下:

代码:

#include?"stdafx.h"

int?_tmain(int?argc,?_TCHAR*?argv[])

{

??return?0;

}

利用VS编译器将运行时程序反汇编,结果如下:

代码:

int?_tmain(int?argc,?_TCHAR*?argv[])

{

010C13A0??push????????ebp??

010C13A1??mov?????????ebp,esp??

010C13A3??sub?????????esp,0C0h??

010C13A9??push????????ebx??

010C13AA??push????????esi??

010C13AB??push????????edi??

010C13AC??lea?????????edi,[ebp-0C0h]??

010C13B2??mov?????????ecx,30h??

010C13B7??mov?????????eax,0CCCCCCCCh??

010C13BC??rep?stos????dword?ptr?es:[edi]??

??return?0;

010C13BE??xor?????????eax,eax??

}

010C13C0??pop?????????edi??

010C13C1??pop?????????esi??

010C13C2??pop?????????ebx??

010C13C3??mov?????????esp,ebp??

010C13C5??pop?????????ebp??

010C13C6??ret

看起来汇编很头疼吧,那么让我们来茅塞顿开吧。首先了解一下以前几个未知半懂的汇编指令的含义:

代码:

push????????ebp

mov?????????ebp,esp

push:把一个32位操作数压入栈中,这个操作导致esp被减4。?ebp被用来保存这个函数执行前的esp的值,执行完毕后用ebp恢复esp。同时,调用此函数的上层函数也用ebp做同样的事情。所以先把ebp压入堆栈,返回之前弹出,避免ebp被我们改动。版权文档,请勿用做商业用途

代码:

xor?????????eax,eax

ret

xor?eax,eax常用来代替mov?eax,0。清零操作。在windows中,函数返回值都是放在eax中然后返回,外部从eax中得到返回值。这就代表return?0操作。版权文档,请勿用做商业用途

代码:

lea?????????edi,[ebp-0C0h]

lea取得第二个参数代表的地址放入第一个参数代表的寄存器中。

代码:

mov?????????ecx,30h??

mov?????????eax,0CCCCCCCCh??

rep?stos????dword?ptr?es:[edi]??

stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时edi会增加4个字节。Rep使指令重复执行ecx中填写的次数。由于CPU的寄存器有限,而且操作寄存器会影响标志值,push作用是压栈,pop是退栈。即保存寄存器标志的值和寄存器本身的值,以便在函数调用完毕后恢复原有的标志值。这也是为什么我们见到在调用某个函数或者运行一个程序时,入口总是push一堆寄存器的东东,也就是这个原因。通过上面的基础知识,我们来看看main函数的反汇编解释:版权文档,请勿用做商业用途

代码:

int?_tmain(int?argc,?_TCHAR*?argv[])

{

010C13A0??push????????ebp??

;保存ebp,返回之前弹出,避免ebp被我们改动。push操作使esp减小,esp不变

010C13A1??mov?????????ebp,esp

;?ebp被用来保存这个函数执行前的esp的值,执行完毕后用ebp恢复esp

;原ebp值已经被压栈(位于栈顶),而新的ebp又恰恰指向栈顶

;此时ebp寄存器就已经处于一个非常重要的地位,该寄存器中存储着栈中的一个地址(原ebp入栈后的栈顶)版权文档,请勿用做商业用途

;从该地址为基准,向上(栈底方向)能获取返回地址、参数值(假如main中有参数,“获取参数值”会比较容易理解版权文档,请勿用做商业用途

;向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的ebp值

010C13A3??sub?????????esp,0C0h?

;把esp往上移动一个范围,等于在栈中开辟一片空间存储main函数的局部变量

;由于冯诺依曼机是小端模式,所以sub操作可以理解为将esp栈顶减去,实际上是为栈增加空间

010C13A9??push????????ebx??

010C13AA??push??

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值