vc怎么查看c源码的汇编语言,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
总结:上面汇编指令序列的模式实际是典型的函数调用过程,简单来说就是保存堆栈指针,保存寄存器,根据临时变量的声明,开辟堆栈空间并初始化,压栈传参,调用函数,恢复寄存器,恢复堆栈指针,退出程序。
下一篇,我会在程序中增加更多内容,展示相应的汇编代码底层实现过程。
vc怎么查看c源码的汇编语言,VC++代码的汇编分析(一)相关推荐
- eclipse工程中查看android源码
在用eclipse开发Android程序时,经常会想看android源码. 下面介绍一种简单的方法,能够方便大家查看android源码. 首先要用SDK Manager将相应版本的android源码下 ...
- 解决查看框架源码时 class file editor source not found
2019独角兽企业重金招聘Python工程师标准>>> 以spring为例,对于从网上下载下来的一个框架的lib文件夹下,通常对于同一名字有三个连续的jar(下图话红线) 我们平常导 ...
- 如何在Eclipse中查看Android源码或者第三方组件包源码
文章出处:http://blog.csdn.net/cjjky/article/details/6535426 在学习过程中如果经常阅读源码,理解程度会比较深,学习效率也会比较高,那么如何方便快捷的阅 ...
- IDEA查看Java源码
IDEA查看Java源码 有时我们需要查看Java源码,总是去查看Java文档可能太过麻烦,下面介绍两种方法来快速查看源码 方法一: Ctrl+Alt+B查阅源码 将光标移动到想要查看的函数或者接口, ...
- Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码
因为大三下的时候选修了搜索技术,了解了网络上搜索引擎和网络爬虫的信息扒取的一些东西,后来我们做了一个比较水的东西,就是只扒取了几家较大的下载网站几十个软件的评分下载量等信息,当用户输入一个程 ...
- IDE:Eclipse查看Servlet源码
转载自 IDE:Eclipse查看Servlet源码 一.源码下载 1.打开tomcat官网:http://tomcat.apache.org/ , 点击右侧下载菜单(以tomcat-7为例 ...
- java查看jdk源码_Java-如何查看JDK源码
一.引言 学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档,然而,开发文档只是开发者对Java代码的功能做出简略的说明,它只是告诉你这个类能干嘛,并没告诉你这个类怎么干,所以,阅读J ...
- 好爽 java_Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和ec...
Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和eclipse,现在换成intellij简直 ...
- Netbeans、Eclipse中查看JDK源码
单纯的会使用JDK里的API似乎还不足以成为猿类,你可以轻松一点,进入到JDK源码里看个究竟.下面说明在Netbeans.Eclipse环境下怎么查看JDK源码: Netbeans: 在"工 ...
最新文章
- 分析了10万起诈骗案例,大数据告诉你:2018年骗子更狡猾了
- 5GS 协议栈 — Overview
- 输出apk_KT被横扫吞下五连败果 APK拿下首胜 小夫笑得十分开心
- svn服务器创建分支原理,svn 创建分支、合并分支、以及报错处理
- Extjs4:改变Grid单元格背景色(转载)
- Apache Flink 为什么能够成为新一代大数据计算引擎?
- 全新的 Fragment 通信方式
- JAVA学习 02Day
- Datawhale编程学习之数组和链表(1)
- C++程序设计方法3:数组下标运算符重载
- sphinx php 扩展安装
- shell错位_shell脚本出错!来大神指出错误出处!!!!
- IPv6Tools:IPv6安全审计框架
- 【从零开始学架构-李运华】04|复杂度来源:高性能
- 架构师之路 — 架构师的职责
- vcm驱动芯片原理_手机Cam和era模组及VCM与VCMDriver介绍.pptx
- html5 js获取设备信息,js怎么获取电脑硬件信息
- Tivoli Storage Manager安装配置
- jenkins安装了中文插件发现界面还有英文的解决方法
- Appium报错:java.lang.SecurityException: uid 2000 does not have android.permission.WRITE_SECURE_SETTING
热门文章
- JDK/Java 14 正式发布!然而我还在用 Java 8...
- 分享一套主流框架源码资料,征服阿里 P7 面试必备!
- Dubbo 管理能力弱?Dubbo Admin 发布 v0.1 助力服务管理能力!
- mysql中vlookup函数_wps表中vlookup函数使用方法将一表引到另一表
- dlp防泄密系统卸载_浙江好用的企业图纸防泄密软件推荐,局域网内部图纸透明加密方案...
- layerui的弹出层只显示两行英文字符不换行的解决方法
- 人脸分割 人脸解析 源码推荐
- linux pip 找不到python
- python opencv 归一化
- TP-GAN 侧脸修复