0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从编译原理的角度看C语言如何转换成汇编语言的?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-02-25 15:52 次阅读

大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言所编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令。

以上这些转变是如何发生的就属于大名鼎鼎的“编译原理”所研究的范畴,作为计算机专业学生,它的重要性毫无质疑,自然也是必修课。而我们几年所要给大家讲的是高级编程语言到汇编语言这一转变的过程,后面就以C语言为例。

怎么样,计科专业的学生或者学过编译原理的看到上面几本书熟悉吗?这几本书差不多是大多数高校编译原理课程的教材了。言归正传,我们今天讨论的是C如何转换成汇编语言,在讲之前先给大家简要介绍下汇编语言:

汇编语言(assembly language)是一种用于电子计算机、微处理器微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

汇编语言的主要特点

(1)汇编语言是直接面向处理器(Processor)的程序设计语言。

(2)汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。

(3)再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。

简单了解了汇编语言,那么根据编译原理C语言是怎么转换成汇编语言的呢?总共可分以下6个步骤:

1. 预处理 -> 2.词法分析 -> 3.语法分析 -> 4.语义分析 -> 5.优化 -> 6.链接

1. 预处理:负责执行C语言中的#include, #if, #else 等预处理指令。注意,这里是去执行这些预处理指令。这些预处理指令的作用是根据你的系统环境配凑出最终版的源代码。

2. 词法分析:把你定义的函数名、变量名、预留的关键字等抽象化,用一个符号来代替,方便编译程序处理。例如上图中的main, return, printf等单词,都被看作一个符号,转换成M, R, P。在这个过程中,会检查你的变量名、函数名名称是否正确。

3. 语法分析:经过词法分析处理之后,程序代码已经变成一堆符号了,例如 I S T F ... M I R P(放心,人已经不认识了,但是计算机能认识)。这时的符号是打散的,语法分析负责把这些符号按照一定的结构组织起来,形成一个抽象语法树(这个结构跟你写的程序代码的结构是对应起来的)。

4. 语义分析:当构造出这样一个树的结构之后,编译就就会检查语法是否正确,并且去扫描这棵树。根据这棵树的结构,生成中间指令了。这个中间指令已经非常接近汇编。中间指令跟汇编还是有区别的,因为不同厂家的CPU指令有所不同,所以还要根据不同厂家的CPU指令集,把这个中间指令转换成汇编。

5. 优化:因为程序员有时代码写的不太好,会导致一些多余的操作,或者效率低的指令。优化过程可以找出这些毛病,自动替换成更好的指令。

6. 链接:以上过程只编译了一个模块,一个大型程序往往包好多个模块。最后的链接过程负责把所有模块组装起来,构造出最后可以执行的程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    705

    浏览量

    41250
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128732
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48617
收藏 人收藏

    评论

    相关推荐

    【RISC-V开放架构设计之道|阅读体验】汇编语言和扩展指令集

    【RISC-V开放架构设计之道|阅读体验】汇编语言和扩展指令集 汇编语言C语言翻译成可执行的机器语言的重要步骤包括
    发表于 02-03 13:29

    汽车ECU编程是单片机C语言还是汇编语言

    汽车ECU编程是单片机C语言吗?还是汇编语言
    发表于 01-26 06:08

    C语言能够实现单片机功能,为什么还要使用汇编呢?

    ,但在某些特定的场景下,使用汇编语言仍然是必要的。在本文中,我们将探讨为什么在一些特殊情况下使用汇编语言是有必要的。 首先,汇编语言可以提供更高的性能。由于C语言是高级
    的头像 发表于 01-15 14:59 233次阅读

    为什么C语言要进行编译

    为什么我们编写的C语言要进行编译?什么是编译编译时发生了什么? 机器无法理解我们编写的C语言,而编译
    的头像 发表于 11-24 15:47 456次阅读
    为什么C<b class='flag-5'>语言</b>要进行<b class='flag-5'>编译</b>

    求助,有什么学习汇编语言的速成好方法吗?

    有什么学习汇编语言的速成好方法吗?
    发表于 11-03 07:32

    基于Proteus与汇编语言的汉字点阵动态显示

    电子发烧友网站提供《基于Proteus与汇编语言的汉字点阵动态显示.pdf》资料免费下载
    发表于 10-30 11:31 1次下载
    基于Proteus与<b class='flag-5'>汇编语言</b>的汉字点阵动态显示

    请问C语言汇编语言在开发单片机时各有哪些优缺点?

    C语言汇编语言在开发单片机时各有哪些优缺点?
    发表于 10-30 06:32

    请问C语言汇编语言在开发单片机时各有哪些优缺点?

    C语言汇编语言在开发单片机时各有哪些优缺点?
    发表于 10-26 07:47

    汇编语言C语言哪个好用一点?

    汇编语言C语言哪个好用一点
    发表于 10-25 08:02

    KEIL查看汇编语言 (?C?ULDIV) 是什么意思?

    KEIL查看汇编语言遇到的问题 (?C?ULDIV) (?C?ULCMP) (?C?LMUL) (?C?UIDIV) 不太明白上面四个子程序
    发表于 10-08 08:48

    ARM汇编语言入门

    语言,只比处理器的母语机器代码高出一步。 用汇编语言编写整个程序,即使是相对简单的程序,也很复杂。这就是为什么大多数人使用CC++等高级语言
    发表于 08-08 07:28

    单片机汇编语言的结构/数据类型/汇编指令

    开发汇编语言是为了为机器级代码指令提供助记符或符号,汇编语言程序由助记符组成,因此应将它们翻译成机器代码。负责这种转换的程序称为汇编程序。汇编语言
    的头像 发表于 07-07 12:28 2010次阅读

    神经元汇编语言参考

    神经元汇编语言参考
    发表于 07-04 20:47 0次下载
    神经元<b class='flag-5'>汇编语言</b>参考

    C语言编译过程

    C语言编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。过程图解如下。
    发表于 06-25 10:36 286次阅读
    C<b class='flag-5'>语言</b>的<b class='flag-5'>编译</b>过程

    CA850 Ver.3.20 汇编语言C编译

    CA850 Ver.3.20 汇编语言C编译
    发表于 05-04 19:04 0次下载
    CA850 Ver.3.20 <b class='flag-5'>汇编语言</b>C<b class='flag-5'>编译</b>包