c语言最简main函数的反汇编代码解析

c语言最简main函数的反汇编代码解析

ID:8907042

大小:17.66 KB

页数:3页

时间:2018-04-11

c语言最简main函数的反汇编代码解析_第1页
c语言最简main函数的反汇编代码解析_第2页
c语言最简main函数的反汇编代码解析_第3页
资源描述:

《c语言最简main函数的反汇编代码解析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、目前我们写的最简单的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  010

2、C13AA  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  01

3、0C13C1  pop         esi  010C13C2  pop         ebx  010C13C3  mov         esp,ebp  010C13C5  pop         ebp  010C13C6  ret看起来汇编很头疼吧,那么让我们来茅塞顿开吧。首先了解一下以前几个未知半懂的汇编指令的含义:代码:push        ebpmov         ebp,esppush:把一个32位操作数压入栈中,这个操作导致esp被减4。 ebp被用来保存这个函数执行前的esp的值,执行完毕后用ebp恢复e

4、sp。同时,调用此函数的上层函数也用ebp做同样的事情。所以先把ebp压入堆栈,返回之前弹出,避免ebp被我们改动。代码:xor         eax,eaxretxor eax,eax常用来代替mov eax,0。清零操作。在windows中,函数返回值都是放在eax中然后返回,外部从eax中得到返回值。这就代表return 0操作。代码:lea         edi,[ebp-0C0h]lea取得第二个参数代表的地址放入第一个参数代表的寄存器中。代码:mov         ecx,30h  mov         eax,0CC

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

6、码: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入栈后的栈顶);从该地址为基准,向上(栈底

7、方向)能获取返回地址、参数值(假如main中有参数,“获取参数值”会比较容易理解;向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的ebp值010C13A3  sub         esp,0C0h ;把esp往上移动一个范围,等于在栈中开辟一片空间存储main函数的局部变量;由于冯诺依曼机是小端模式,所以sub操作可以理解为将esp栈顶减去,实际上是为栈增加空间010C13A9  push        ebx  010C13AA  push        esi  010C13AB  push        

8、edi  ;保存三个寄存器的值,待main结束恢复,原来的值被破坏有可能引起系统崩溃010C13AC  lea         edi,[ebp-0C0h]  ;把ebp-0c0h加载到edi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。