精华内容
下载资源
问答
  • 预处理器,编译器汇编器连接器的概念和区别

    千次阅读 多人点赞 2019-02-14 16:14:21
    汇编语言为不同高级语言的不同编译器提供了通用的输出语言,比如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。 e.g. (3).汇编(as): 将.s翻译成机器语言指令,把这些指令打包成一种叫做 ...

    好记性不如烂笔头,所以准备详细的记录一下这几个东西的功能和区别,有例子为证。

    参考博客:https://www.cnblogs.com/hutao886/p/5614296.html

    hello程序的生命周期是从一个源程序(hello.c)(称为高级c语言)开始,被其它程序转化为一系列的低级机器语言指令,这些指令按照一种称为可执行目标程序的格式打包好,以二进制磁盘文件的形式保存。

      例:unix> gcc -o hello hello.c可以实现源文件向目标文件的转化,该过程由编译程序完成。

      hello.c  ---->hello.i  ---->hello.s  ---->hello.o  -->hello

    拿一个简单的例子,例子叫做Base.c,内容如下:

    #include <stdio.h>
    
    /*这是一条注释*/
    int main(){
      printf("Hello world\n");
      return 0;
    }

    (1).预处理(cpp):预处理器不止一种,而C/C++的预处理器就是其中最低端的一种——词法预处理器,主要是进行文本替换、宏展开、删除注释这类简单工作。

    • gcc -E 选项可以得到预处理后的结果,扩展名为.i;
    • C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情;
    • 预处理之后,得到的仅仅是真正的源代码;
    • GCC确实很强大,如果是用VC这种IDE,恐怕就不能看到预处理后的结果。

        e.g. 所谓预处理,就是把程序中的宏展开,把头文件的内容展开包含进来,预处理不会生成文件,所以需要重定向

    (2).编译器(ccl):将文本文件.i翻译成文本文件.s,得到汇编语言程序(把高级语言翻译为机器语言),该种语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。

    • gcc -S 选项可以得到编译后的汇编代码,扩展名为.s;
    • 汇编语言为不同高级语言的不同编译器提供了通用的输出语言,比如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。

    e.g.

    (3).汇编(as):将.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件.o中(把汇编语言翻译成机器语言的过程)。

    • gcc -c 选项可以得到汇编后的结果,扩展名为.o;
    • .o是一个二进制文件,它的字节编码是机器语言指令而不是字符。如果在文本编辑器中打开.o文件,看到的将是一堆乱码。
    • 把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

    e.g.

    (4).链接(ld):gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。

    展开全文
  • 加载时,也就是在程序被加载(loader)加载到内存并执行时; 运行时;也就是由应用程序来执行。 2、从源文件到可执行文件 考虑两个源文件main.c和sum.c。 int sum(int *a, int n); int aray[2] = {1, 2}; int ...

    链接的概念

    链接(lingking)是将各种代码和数据片段收集并组合成为一个大一文件的过程,这个文件可以加载(复制)到内存并执行。

    链接可以执行于

    1. 编译时,也就是在源代码被翻译成机器代码时;
    2. 加载时,也就是在程序被加载器(loader)加载到内存并执行时;
    3. 运行时;也就是由应用程序来执行。

    从源文件到可执行文件

    考虑两个源文件main.c和sum.c。

    int sum(int *a, int n);
    
    int aray[2] = {1, 2};
    
    int main()
    {
        int val = sum(array, 2);
        return val;
    }
    
    int sum(int *a, int n)
    {
        int i, s = 0;
        
        for(i = 0; i < n; i++){
            s += a[i];
        }
    }
    

    请添加图片描述

    如上图。驱动程序依次执行以下步骤:

    1. 首先,运行C预处理器(cpp),将C的源程序main.c翻译成一个ASCII码的中间文件main.i;
    2. 接下来,运行C编译器(ccl),将main.i翻译成一个ASCII码的汇编语言文件main.s;
    3. 然后,运行汇编器(as),将main.s翻译成一个可重定位目标文件main.o;
    4. 经过上述三个步骤生成sum.o;
    5. 最后,运行链接器(ld),将main.o和sum.o以及一些必要的系统文件组合起来,创建一个可执行目标文件prog。

    各阶段的功能如下:

    1. 预处理主要用于C语言编译器对各种预处理命令进行处理,包括对头文件的包含、宏定义的扩展、条件编译的选择等。例如,对# include指示的处理结果,就是将对应.h文件的内容插入到源程序文件中。
    2. 编译会先对源程序进行词法分析语法分析语义分析,然后根据分析的结果进行代码优化存储分配,最终会把C语言源程序翻译成汇编语言程序
    3. 汇编的功能是将编译生成的汇编语言代码转换为机器语言代码
    4. 链接的功能是将所有关联的可重定位目标文件组合起来,以生成一个可执行文件。

    C语言的翻译层次

    在这里插入图片描述

    编译器

    编译器将C程序转换成一种机器能理解的符号形式的汇编语言程序(assmbly language program)

    汇编器

    伪指令:汇编语言指令的一个变种,通常被看作一条汇编指令。

    汇编器将汇编语言程序转换成目标文件(object file),它包括机器语言指令、数据和指令正确放入内存所需要的信息。

    汇编器将分支和数据传输指令中用到的标号都放入一个**符号表(symbol table)**中。

    符号表:一个用来匹配标记名和指令所在内存字的地址的列表。

    UNIX系统中的目标文件通常包含以下6个不同的部分:

    • 目标文件头,描述目标文件其他部分的大小和位置。
    • 代码段,包含机器语言代码。
    • 静态数据段,包含在程序生命周期内分配的数据
    • 重定位信息,标记了一些在程序加载进内存时依赖于绝对地址的指令和数据。
    • 符号表,包含未定义的剩余标记,如外部引用。
    • 调试信息,包含一份说明目标模块如何编译的简明描述,这样,调试器能够将机器指令关联到 C源文件,并时数据结构也变得可读。

    链接器

    链接器:也称链接编译器。它是一个系统程序,把各个独立汇编的机器语言程序组合起来并且解决所有未定义的标记,最后生成可执行文件。

    可执行文件:一个具有目标文件格式的功能程序,不包含未解决的引用。它可以包含符号表和调试信息。

    链接器的工作分3个步骤

    1. 将代码和数据模块象征性地放入内存。
    2. 决定数据和指令标签的地址。
    3. 修补内部和外部引用。

    加载器

    加载器:把目标程序装载到内存中以准备运行的系统程序。

    现在可执行文件已经在磁盘中,操作系统可以将其读入内存并启动执行它。在UNIX系统中,加载器(loader)按照如下步骤工作:

    1. 读取可执行文件头来确定代码段和数据段的大小。
    2. 为正文和数据创建一个足够大的地址空间。
    3. 将可执行文件中的指令和数据复制到内存中。
    4. 把主程序的参数(如果存在)复制到栈顶。
    5. 初始化机器寄存器,将栈指针指向第一个空位置。
    6. 跳转到启动例程,它将参数复制到参数寄存器并且调用程序的main函数。当main函数返回时,启动例程通过系统调用exit终止程序。

    动态链接库

    动态链接库(dynamically linked library,DLL):在程序执行过程中才被链接的库例程。

    展开全文
  • 汇编器将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序。 得到.o文件,是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。 链接器: 链接器负责 .o 文件的合并。...

    编译器:

    • 编译器把高级语言翻译为机器语言
    • 得到hello.s文件,这个是汇编语言程序
    • 不同的高级语言翻译的汇编语言相同

    汇编器:

    • 汇编器将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序。
    • 得到.o文件,是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。

    链接器:

    • 链接器负责 .o 文件的合并。得到的是可执行目标文件。
    • gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去。 函数库一般分为静态库和动态库两种。
    • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。
    • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。
    展开全文
  • 编译器:将高级语言转换为低级语言 汇编器:是将汇编翻译为机器语言 链接器:将一个或多个由编译器汇编器生成的目标文件外加库链接为一个可执行文件 ...

    编译器:将高级语言转换为低级语言

    汇编器:是将汇编翻译为机器语言

    链接器:将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件

     

    展开全文
  • 汇编语言为不同高级语言的不同编译器提供了通用的输出语言,比如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。 (3).汇编(as): 将.s翻译成机器语言指令,把这些指令打包成一种叫做 可重...
  • 本人学习王爽老师的《汇编语言》的时候,死活也没找到这个link.exe 和 masm.exe,后来还是一位汇编高人发给我,传上来让汇编新人有个顺利的开端
  •  我从没见过(不过应该有)任何一本C++教材有讲过何谓编译器(Compiler)及连接器(Linker)(倒是在很老的C教材中见过),现在都通过一个类似VC这样的编程环境隐藏了大量东西,将这些封装起来。在此,对它们的理解...
  • 汇编语言常用工具 呵 我发现大家都在学汇编语言 我上传的是masm汇编编译器 linker连接器 希望对大家有所帮助
  • 微软出的汇编语言编译器和链接,学习汇编语言用的
  • 64位汇编语言程序编译器64位汇编语言程序编译器64位汇编语言程序编译器
  • 预处理器,编译器汇编器连接器 1.2程序被其它程序翻译成不同的格式  hello程序的生命周期是从一个源程序(hello.c)(称为高级c语言)开始,被其它程序转化为一系列的低级机器语言指令,这些指令按照一种...
  • 最近给十一个职业软件开发工程师做《linux平台软件开发》课程。才发现,工作过两三年后的软件工程师也分不清这些概念...编译器:实现语言标准的一种产品。比如Borland C++ ,delphi pascal,gcc,mircosoft c++,intel
  • 通过一些实例来学习keil单片机,输入源程序,建立工程,对工程进行详细设置,以及如何将源程序变为目标程序。
  • 汇编连接编译器合体(LINK、MASM) 以及LINK.EXE 和MASM.EXE的合体 ML.EXE
  • 编译器如何生成汇编

    2019-04-26 21:11:40
    理解什么是汇编,以及编译器如何生成它,对于理解 WebAssembly 是很有帮助的。 现在来思考一下“外星人”的大脑是如何工作的——机器的“大脑”是如何对我们输入给它的内容进行分析和理解的。 “大脑”中,有一部分...
  • 这种被称为“编译器”的新程序可以把用高级语言写的程序转换成汇编语言,再使用汇编器把汇编语言转换成机器可读的程序。这种程序组合常常被称为“工具链”,因为一个程序的输出就直接成为另一个程序的输入。 编译...
  • 资源里带有8086汇编语言编译器masm.exe和联接link.exe,是学习王爽老师的汇编语言必须的工具!
  • 关于编辑器,编译器汇编器,以及跨平台的思考编辑器的作用编译器汇编器的作用 编辑器的作用 编辑器用来接收键盘输入的字符,比如记事本等,但是这类编辑器没有语法高亮,补全等功能,对使用者不够友好,因此书写...
  • 16位汇编语言所需全套编译器 bin目录里为本软件 ... mcs51为MCS51类型的编译器,用于MCS51单片机汇编语言的编译,其中:asm51.exe为编译器,OH.exe为目标文件转十六进制文件(连接器选项选择此文件)
  • 编译器:在一个程序可以运行之前,它首先需要被翻译成一种能够被计算机执行的形式,简单地说,一个编译器就是一个程序,他可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成为一个等价的、用另一种语言...
  • LLVM Clang编译器 什么是clang编译器? clang是LLVM编译器工具集的一个用于编译C、C++、Objective-C的前端。LLVM项目的目标是提供一个GNU编译器套装(gcc)的替代品,由苹果公司的赞助开发,其源代码授权采用的是...
  • 要现在选项菜单中选择您所使用的编译器类型及其目录所在bin目录里为本软件 files目录为汇编语言写的用于测试的程序 source目录为本软件的源代码 masm为MASM类型的编译器,其中:masm.exe为编译器,link.exe为连接器
  • IDE、编辑编译器、解释与调试写在前面IDE编辑器编译器解释调试器编译器和解释的区别和优缺点编译器和调试的区别 写在前面 对于这些概念,我只是记录一下自己的理解,如果有不对的地方请多多指正。 IDE...
  • 汇编语言编译器

    2011-09-25 14:10:10
    该软件提供了编辑、编译、运行、调试汇编语言程序的集成环境。目前支持MASM、TASM、MCS51三种编译器。第一次使用时,要现在选项菜单中选择您所... masm为MASM类型的编译器,其中:masm.exe为编译器,link.exe为连接器
  • 常见的编辑有文本编辑、网页编辑、源程序编辑、图像编辑,声音编辑和视频编辑等。 当然在这里我们主要讲的是代码编辑,一个好的编辑可以节省开发时间,提高工作效率,它们都能提供非常方便易用...
  • 编译器与编辑以及IDE的区别【前方高能】

    万次阅读 多人点赞 2019-06-30 10:54:39
    一、编译器 ...一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接 (Linker) → 可执行程序 (execut...
  • C编译器、链接、加载详解

    千次阅读 2018-07-27 16:14:17
    可重定位(Relocatable)文件:由编译器汇编器生成,可以与其他可重定位目标文件合并创建一个可执行或共享的目标文件; 共享(Shared)目标文件:一类特殊的可重定位目标文件,可以在链接(静态共享库)时加入目标...
  • 汇编编译器

    2013-04-16 10:06:11
    32位的汇编编译器,包括masm和tasm和起相应的连接器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,014
精华内容 17,605
关键字:

编译器汇编器链接器