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

    文章

    795

    浏览量

    41645
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136713
  • 编译器
    +关注

    关注

    1

    文章

    1624

    浏览量

    49111
收藏 人收藏

    评论

    相关推荐

    TMS320C6000汇编语言工具 v8.3.x

    电子发烧友网站提供《TMS320C6000汇编语言工具 v8.3.x.pdf》资料免费下载
    发表于 11-07 10:00 0次下载
    TMS320<b class='flag-5'>C</b>6000<b class='flag-5'>汇编语言</b>工具 v8.3.x

    ARM汇编语言工具

    电子发烧友网站提供《ARM汇编语言工具.pdf》资料免费下载
    发表于 11-06 09:12 0次下载
    ARM<b class='flag-5'>汇编语言</b>工具

    TMS320C28x汇编语言工具

    电子发烧友网站提供《TMS320C28x汇编语言工具.pdf》资料免费下载
    发表于 11-01 09:32 0次下载
    TMS320<b class='flag-5'>C</b>28x<b class='flag-5'>汇编语言</b>工具

    TMS320LF240x DSP的C语言汇编代码快速入门

    电子发烧友网站提供《TMS320LF240x DSP的C语言汇编代码快速入门.pdf》资料免费下载
    发表于 10-18 10:14 0次下载
    TMS320LF240x DSP的<b class='flag-5'>C</b><b class='flag-5'>语言</b>和<b class='flag-5'>汇编</b>代码快速入门

    hex文件怎么能转回去c语言

    的差异。 然而,如果你想要从 .hex 文件中获取一些有用的信息或者对程序进行分析,你可以采取以下步骤来尽可能接近原始的C语言逻辑: 反汇编 : 使用反汇编工具(如IDA Pro、Gh
    的头像 发表于 09-02 10:46 2101次阅读

    hex可以转成源代码么

    Hex文件可以转换成源代码的近似形式,但无法直接还原为原始的、完全相同的源代码 。这是因为Hex文件是二进制文件,包含了程序编译后的机器码,这些机器码与原始的源代码在结构和表达上存在显著的差异。不过
    的头像 发表于 09-02 10:41 980次阅读

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器码,这些机器码与原始的
    的头像 发表于 09-02 10:37 2141次阅读

    RISC-V汇编语言

    一、导言 C 程序翻译成为可以在计算机上执行的机器语言程序的四个经典步骤。这一章的内容包括了后三个步骤,不过我们要从汇编语言在 RISC-V 函数调用规范中的作用开始说起。 上图
    发表于 08-19 18:07

    C语言:嵌入式开发中的关键编译器角色

    嵌入式程序开发跟硬件密切相关,需要使用C语言来读写底层寄存器、存取数据、控制硬件等,C语言和硬件之间由编译器来联系,一些
    发表于 04-26 14:53 611次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>:嵌入式开发中的关键<b class='flag-5'>编译</b>器角色

    请问在STM32CubeIDE下如何嵌入汇编语言代码?

    在STM32CubeIDE下如何嵌入汇编语言代码??
    发表于 03-25 06:56

    C语言#define的应用

    C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序
    发表于 03-06 11:29 375次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用

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

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

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

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

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

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

    嵌入式C语言大神的进阶思路

    熟悉一种或几种CPU架构,掌握几种架构的汇编语言,学会使用反汇编去分析C语言底层运行过程
    的头像 发表于 01-02 09:58 624次阅读