logo资料库

预备工作1——了解你的编译器.pdf

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
了解 VS 编译器 调研报告 姓名: 柴源 学号: 1611275 专业: 计算机科学与技术 1
C++程序在 VS 中编译的过程 柴源 1611275 计算机科学与技术 摘要: 本文主要从 VS2015 编译器出发,简要的说明编译器如何把 C·++代码最后翻译成机器 语言的四个阶段——预处理阶段,编译阶段,汇编阶段,链接阶段,并且主要对其中编译器 将预处理之后的程序进行编译生成的汇编码和编译器的一些优化选项进行了理解。 关键字:VS 编译器;反汇编;C++; 优化 引言: 编译器是一种计算机程序,它会将某种编程语言写成的源代码,转换成另一种编程语言。 它主要的目的是将便于人编写,阅读,维护的高级计算机语言所写作的源代码程序,翻译为 计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。一个现代的编译器主要工 作流程是:源代码->预处理器->编译器->汇编程序->目标代码->链接器->可执行文件。 VS 编译器把对应的*.cpp 翻译成*.s 文件(汇编语言),汇编器则处理*.s 生成对应的*.o 文件(obj 目标文件),汇编器是将代码语言翻译成机器语言最后链接器把所有的*.o 文件链 接成一个可执行文件(.exe) 。 1、编译的过程: 从源代码生成可执行文件共分为四个阶段:预处理阶段、编译阶段、汇编阶段和链接 阶段。预处理阶段预处理器会去掉源代码中的预处理命令,编译阶段编编译器使用预处理 器的输出文件生成汇编源文件,汇编阶段汇编器将汇编源文件转化为目标二进制文件,最 后链接器把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终的可执行 代码。过程图解如下: 2
图 1:C++源代码变成可执行程序的流程 2、预处理器 预处理器是在真正的编译开始之前由编译器调用的独立程序。预处理器可以删除注释、 包含其他文件以及执行宏(宏 macro 是一段重复文字的简短描写)替代。 3
可以看到,头文件中的内容被完整替换到#include 命令所在的位置,预处理也可以将 #define 命令定义的常量被替换为相应的值以及去掉注释。 3、编译器 VS 编译器会对预处理的代码进行语法分析和词法分析,生成相应的汇编代码,可以查 看生成的汇编文件,这部分内容我理解的不深,借助 VS 编译器的调试反汇编查看 VS 编译 器生成的汇编代码,并且根据代码对汇编的一些常见指令进行了学习和了解 3.1 阶乘汇编代码 4
图 2:阶乘反汇编代码 5
3.2 斐波那契反汇编代码 6
图 3:斐波那契反汇编代码 3.3 一些常见的汇编指令 Move:数据传送 Xor: 异或指令,这本身是一个逻辑运算指令,但在汇编指令中通常会见到它被用来 实现清零功能。用 xor eax,eax 这种操作来实现 mov eax,0,可以使速度更快,占用字节 数更少。 Call: 调用函数,一般函数的参数放在寄存器中; lea :取得第二个参数地址后放入到前面的寄存器(第一个参数),然而 lea 也同样 可以实现 mov 的操作 jmp:无条件跳转指令 3.4 汇编代码的一些修改及理解 VS 反汇编每句话对应下面的汇编代码,以其中 f=f*i 为例。先将 f 的值取出放于寄存 7
器 eax 中,然后与 i 相乘放于寄存器 eax 中,最后再将 eax 的值放入数据存储器 将斐波那契的 while 循环改成 for 循环,观察汇编代码的变化 While 循环首先取出数据 i,然后与数据 n 进行比较,最后如果出现大于的情况有一 图 4:while 循环下的汇编代码 个跳转指令 图 5:for 循环下的汇编代码 For 循环首先先给 i 赋值,然后进行跳转,执行循环内部的代码,执行之后跳转回 来,将 i 的值放入寄存器中,进行 add 操作,然后进行 i 与 n 的比较,如果大于等于则进 行跳转出循环 两个循环的本质基本相同,在汇编上的实现也都是基于判断然后选择地址进行跳转 4、汇编器 汇编阶段使用汇编器将汇编源代码汇编为目标机器指令文件,该阶段生成的文件为二 进制文件。目标文件由段组成,通常一个目标文件中至少有两个段:代码段和数据段。代 码段中包含的主要是程序的指令,一般是可读可执行的,但一般确不可写;数据段主要存 放程序中要用到的各种全局变量或静态的数据,一般数据段都是可读,可写,可执行的。 使用.s –.o 生成目标二进制文件,没有找到 VS 如何查看.o 文件,利用 GCC 生成的部分二 进制代码如图: 图 6:汇编之后生成的.o 文件的部分代码 5、链接器 链接器(Linker)是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加 库链接为一个可执行文件。目标文件是包括机器码和链接器可用信息的程序模块。简单的 讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地 8
分享到:
收藏