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

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

使用更高版本的VC编译,默认堆栈大小会不同,若编译为64位,差别更大,以后再讨论。

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

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

  1. 高级C代码的汇编分析

    在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要 ...

  2. VC 函数调用的 汇编代码 浅析

    摘要:主要谈谈vc里面函数调用汇编成汇编代码的情形,首先针对之前的一个小程序,说说vc编译器的优化. 例子程序: #include <iostream>using namespace st ...

  3. GDB调试汇编分析

    GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...

  4. 20145233 GDB调试汇编分析

    GDB调试汇编分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long ad ...

  5. Keil开发的ARM程序main函数之前的汇编分析

    Keil开发的ARM程序main函数之前的汇编分析 ——BIN文件中RW段的数据移动 系统平台: STM32系列STM32F103ZE,512KB内部FLASH,64KB片内存储; FLASH地址范围 ...

  6. Swift系列七 - 汇编分析值类型

    通过汇编分下值类型的本质. 一.值类型 值类型赋值给var,let或者给参数传参,是直接将所有内容拷贝一份.类似于对文件进行复制粘贴操作,产生了全新的文件副本,属于深拷贝(deep copy). 示例 ...

  7. 打造smali代码库辅助分析

    打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...

  8. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

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

    漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...

随机推荐

  1. 精彩,sinox.org官网贴满winxp死亡大字报

    sinox杀死windowxp不可避免,不用说,微软还自己掐死他!!! 中国人会升级正版 windows7吗?昨天也许会,但今天不会了,因为 sinox大字报出来了! 这下举国皆知了. 换装sinox ...

  2. UVa 10465 Homer Simpson (枚举)

    10465 - Homer Simpson Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onli ...

  3. HTML5要点(四)对象全整理

    最近在自学H5,一下整理出来一些主要用到的知识点 1.JavaScript 对象 JS Array JS Boolean JS Date JS Math JS Number JS String JS ...

  4. Android设计模式系列--工厂方法模式

    工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...

  5. Tomcat服务器常用配置和HTTP简介

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  6. 【转】二叉树 VS hashtable

    hash_table和二叉搜索树都经常被用来构建符号表(或者字典)以及相关的结构,并且他们都表现出了很高的效率.最近也在不同的程序中使用了这两种数据结构,实现完毕后思考一下,对两者做了一个简单的比较: ...

  7. WINHTTP的API接口说明。

    BOOL WINAPI WinHttpAddRequestHeaders(   _In_  HINTERNET hRequest,   _In_  LPCWSTR pwszHeaders,   _In ...

  8. iBatis调用存储过程以及MySQL创建存储过程

    首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...

  9. Windows Phone开发-开发环境和结构

    Windows Phone 7.1的开发工具发布了,一直对WP7很关注,现在终于可以开始学习了.其实09年就学习过silverlight,看过3的SDK文档,当时因为工作,断断续续也没有坚持下来,所以 ...

  10. 《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记

    一.锁的劣势 锁定后假设未释放.再次请求锁时会造成堵塞.多线程调度通常遇到堵塞会进行上下文切换,造成很多其它的开销. 在挂起与恢复线程等过程中存在着非常大的开销,而且通常存在着较长时间的中断. 锁可能 ...