VC++代码的汇编分析(一)

VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确、直观、深刻理解高级语言中很多概念和技术的真正含义,对程序优化和编码都有非常实用的重要价值。由于内容很多,我会分解为很多篇章进行解读实例。

从main入口开始分析,使用古老的VC6.0编译器编译,先从最简单的例子开始逐步扩展,便于大家逐步入门。

VC++源代码:

int main(int argc, char* argv[])

{
printf("Hello World!\n");
return 0;
}

最简单不过的代码了,看看汇编代码是什么呢?关于32位X86寄存器的基础知识,大家可以自己先上网看啦。

debug状态下无优化的汇编代码:

int main(int argc, char* argv[])
20: {
00401030 55          push ebp     ==保存EBP
00401031 8B EC        mov ebp,esp  ==保存ESP
00401033 83 EC 40      sub esp,40h      ==没有定义任何临时变量的情况下,默认预留64字节的栈内存空间
00401036 53           push ebx         ==保存EBX
00401037 56           push esi           ==保存ESI
00401038 57           push edi          ==保存edi
00401039 8D 7D C0       lea edi,[ebp-40h]  ==将栈顶地址放入EDI中
0040103C B9 10 00 00 00    mov ecx,10h    ==计数器16放入ECX
00401041 B8 CC CC CC CC    mov eax,0CCCCCCCCh ===初始值为指向INT3地址
00401046 F3 AB        rep stos dword ptr [edi]  ===初始化16个DWORD的栈空间
26: printf("Hello World!\n");
00401048 68 1C 20 42 00    push offset string "Hello World!\n" (0042201c)  ==将字符串参数地址入栈
0040104D E8 EE 00 00 00    call printf (00401140) ==调用函数
00401052 83 C4 04      add esp,4    ==恢复ESP
27: return 0;
00401055 33 C0        xor eax,eax  ==EAX清零
28: }
00401057 5F          pop edi   ==恢复EDI
00401058 5E          pop esi  ==恢复ESI
00401059 5B          pop ebx  ==恢复EBX
0040105A 83 C4 40       add esp,40h  ==恢复ESP
0040105D 3B EC        cmp ebp,esp   ==检查ESP和EBP
0040105F E8 5C 01 00 00    call __chkesp (004011c0) ==比较检查结果,若不相等会抛出异常
00401064 8B E5        mov esp,ebp    ==恢复esp
00401066 5D          pop ebp     ==恢复ebp
00401067 C3          ret

总结:上面汇编指令序列的模式实际是典型的函数调用过程,简单来说就是保存堆栈指针,保存寄存器,根据临时变量的声明,开辟堆栈空间并初始化,压栈传参,调用函数,恢复寄存器,恢复堆栈指针,退出程序。

下一篇,我会在程序中增加更多内容,展示相应的汇编代码底层实现过程。

时间: 2024-10-12 18:21:53

VC++代码的汇编分析(一)的相关文章

高级C代码的汇编分析

在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要负责清除堆栈 所以这种调用常会生成较大的可执行文件. _stdcall又称为WINAPI调用方式,规则: 1,参数从右向左入堆栈 2,被调用的函数在返回前自行清理堆栈 所以这种调用会生成比cdecl小的代码 Pascal调用方式,主要用在WIN16函数库中,现在基本不用 规则: 1,参数从左向右入堆

GDB调试汇编分析

GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置

VC内嵌汇编基础知识

http://www.cppblog.com/xingkongyun/archive/2008/12/21/70003.html 为了加速游戏,一提起汇编语言,大家也许会感到很神秘.其实如果你学起来就会发现,它并非想象中那样难.特别是内嵌汇编,由于它和C++紧密结合, 使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来比较容易.使用内嵌汇编,特别是使用MMX指令,可以大大提高各种游戏中常见特效的速 度,对于编出一个漂亮的游戏非常重要.学好汇编语言还有一个特别有趣的用处:可以观察和看懂

CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析

漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc下载链接如下. github地址:https://github.com/edwardz246003/IIS_exploit 结合上面的POC,我们对漏洞的成因及利用过程进行了详细的分析.在分析过程中,对poc的exploit利用技巧感到惊叹,多次使用同一个漏洞函数触发,而同一个漏洞同一段漏洞利用代码

MDU某产品OMCI模块代码质量现状分析

说明 本文参考MDU系列某产品OMCI模块现有代码,提取若干实例以说明目前的代码质量. 本文旨在就事论事,而非否定前人(没有前人的努力也难有后人的进步).希望以史为鉴,不破不立,最终产出高质量的代码. 一  质量现状 不考虑业务实现,现有的OMCI模块代码质量不甚理想.无论是理解上手.修改扩展和测试排障,可以用举步维艰形容.尤其是二层通道计算相关代码,堪比令史前动物无法自拔的"焦油坑". 本节将不考虑流程设计,仅就函数粒度列举目前存在的较为突出的代码质量问题. 1.1 巨型函数 通过S

【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)

树导航效果图: 组合模式的描述: 将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 我们把部分用Leaf表示, 把整体用Composite表示.组合模式是有一定规律的,在实现树导航的情况下,Composite需要包含一个以上Leaf,也可以包含一个以上Leaf和一个以Composite,为什么说要包含一个以上的,如果Composite不包含任何子child的话那么它就是Leaf,Leaf表示是最后一层结节. 树形导航代码片段:

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

[JS 设计模式 ]用组合模式来实现树形导航--代码结构思路分析(一) 根据上一节中的HTML代码结构我们通过JS来渲染HTML代码,我们先提供一下JS的代码片段,这代码代码不是一个完整的代码是经过简化的.通过JS代码来分析如何组装HTML的 Composite类型的代码: function TreeComposite(id, name, total, level, last) { var root = document.createDocumentFragment(); var panel =

打造smali代码库辅助分析

打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 然后可以制作成各种代码模版,放在Android Killer中使用(代码模版管理器) Android Killer 自带3种代码模版 1. LoadLibrary const-string v0, "so name" invoke-static {v0}, Ljava/lang/Syste

[Android6.0][RK3399] 双屏异显代码实现流程分析(一)【转】

本文转载自:http://blog.csdn.net/dearsq/article/details/55049182 Platform: RK3399 OS: Android 6.0 Version: v2016.08 代码流程 代码详解 mipi dsi 接口信息初始化 fb相关信息读取 timing 参数初始化 mipi dsi controller 初始化 lcdc控制器注册 本文分为两部分. <[RK3399] 双屏异显代码实现流程分析(一)>为分析 RK video 部分标准的代码(