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怎么查看c源码的汇编语言,VC++代码的汇编分析(一)相关推荐

  1. eclipse工程中查看android源码

    在用eclipse开发Android程序时,经常会想看android源码. 下面介绍一种简单的方法,能够方便大家查看android源码. 首先要用SDK Manager将相应版本的android源码下 ...

  2. 解决查看框架源码时 class file editor source not found

    2019独角兽企业重金招聘Python工程师标准>>> 以spring为例,对于从网上下载下来的一个框架的lib文件夹下,通常对于同一名字有三个连续的jar(下图话红线) 我们平常导 ...

  3. 如何在Eclipse中查看Android源码或者第三方组件包源码

    文章出处:http://blog.csdn.net/cjjky/article/details/6535426 在学习过程中如果经常阅读源码,理解程度会比较深,学习效率也会比较高,那么如何方便快捷的阅 ...

  4. IDEA查看Java源码

    IDEA查看Java源码 有时我们需要查看Java源码,总是去查看Java文档可能太过麻烦,下面介绍两种方法来快速查看源码 方法一: Ctrl+Alt+B查阅源码 将光标移动到想要查看的函数或者接口, ...

  5. Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码

         因为大三下的时候选修了搜索技术,了解了网络上搜索引擎和网络爬虫的信息扒取的一些东西,后来我们做了一个比较水的东西,就是只扒取了几家较大的下载网站几十个软件的评分下载量等信息,当用户输入一个程 ...

  6. IDE:Eclipse查看Servlet源码

    转载自   IDE:Eclipse查看Servlet源码 一.源码下载 1.打开tomcat官网:http://tomcat.apache.org/    , 点击右侧下载菜单(以tomcat-7为例 ...

  7. java查看jdk源码_Java-如何查看JDK源码

    一.引言 学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档,然而,开发文档只是开发者对Java代码的功能做出简略的说明,它只是告诉你这个类能干嘛,并没告诉你这个类怎么干,所以,阅读J ...

  8. 好爽 java_Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和ec...

    Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和eclipse,现在换成intellij简直 ...

  9. Netbeans、Eclipse中查看JDK源码

    单纯的会使用JDK里的API似乎还不足以成为猿类,你可以轻松一点,进入到JDK源码里看个究竟.下面说明在Netbeans.Eclipse环境下怎么查看JDK源码: Netbeans: 在"工 ...

最新文章

  1. 分析了10万起诈骗案例,大数据告诉你:2018年骗子更狡猾了
  2. 5GS 协议栈 — Overview
  3. 输出apk_KT被横扫吞下五连败果 APK拿下首胜 小夫笑得十分开心
  4. svn服务器创建分支原理,svn 创建分支、合并分支、以及报错处理
  5. Extjs4:改变Grid单元格背景色(转载)
  6. Apache Flink 为什么能够成为新一代大数据计算引擎?
  7. 全新的 Fragment 通信方式
  8. JAVA学习 02Day
  9. Datawhale编程学习之数组和链表(1)
  10. C++程序设计方法3:数组下标运算符重载
  11. sphinx php 扩展安装
  12. shell错位_shell脚本出错!来大神指出错误出处!!!!
  13. IPv6Tools:IPv6安全审计框架
  14. 【从零开始学架构-李运华】04|复杂度来源:高性能
  15. 架构师之路 — 架构师的职责
  16. vcm驱动芯片原理_手机Cam和era模组及VCM与VCMDriver介绍.pptx
  17. html5 js获取设备信息,js怎么获取电脑硬件信息
  18. Tivoli Storage Manager安装配置
  19. jenkins安装了中文插件发现界面还有英文的解决方法
  20. Appium报错:java.lang.SecurityException: uid 2000 does not have android.permission.WRITE_SECURE_SETTING

热门文章

  1. JDK/Java 14 正式发布!然而我还在用 Java 8...
  2. 分享一套主流框架源码资料,征服阿里 P7 面试必备!
  3. Dubbo 管理能力弱?Dubbo Admin 发布 v0.1 助力服务管理能力!
  4. mysql中vlookup函数_wps表中vlookup函数使用方法将一表引到另一表
  5. dlp防泄密系统卸载_浙江好用的企业图纸防泄密软件推荐,局域网内部图纸透明加密方案...
  6. layerui的弹出层只显示两行英文字符不换行的解决方法
  7. 人脸分割 人脸解析 源码推荐
  8. linux pip 找不到python
  9. python opencv 归一化
  10. TP-GAN 侧脸修复