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

    文章

    809

    浏览量

    42796
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144605
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51080
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    汇编语言还有必要学习吗

    1、嵌入式操作系统需要汇编语言 2、实时性要求非常高的地方,需要汇编语言,比如FFT算法。 3、汇编语言做运算那叫一个痛苦,下面是一段双字节乘法,浮点数就更难搞
    的头像 发表于 11-25 11:46 452次阅读
    <b class='flag-5'>汇编语言</b>还有必要学习吗

    C语言自动类型转换

    是通过定义类型转换运算来实现的。其一般形式为: (数据类型) (表达式) 其作用是把表达式的运算结果强制转换成类型说明符所表示的类型 在使用强制转换时应注意以下问题: 数据类型和表达式都必须加
    发表于 11-25 08:04

    C语言强制类型转换

    强制类型转换是通过定义类型转换运算来实现的。其一般形式为: (数据类型) (表达式) 其作用是把表达式的运算结果强制转换成类型说明符所表示的类型 在使用强制转换时应注意以下问题:
    发表于 11-24 06:32

    pdf如何转换成pptx

    df如何转换成pptx   将 pdf 转成 powerpoint pptx 文件是很常见的需求,当你需要把现有文档内容做成幻灯片时可以这样做,本文介绍一些简单实用的步骤,可以用免费工具或内置软件
    的头像 发表于 11-22 09:42 663次阅读

    开源鸿蒙技术大会2025丨编译器与编程语言分论坛:语言驱动系统创新,编译赋能生态繁荣

    在万物智联的时代背景下,操作系统底层能力的构建离不开编程语言编译器的关键支撑。作为开源鸿蒙生态的核心技术,语言设计与编译器、虚拟机实现的进步直接关系到开发效率、运行性能与系统安全。本
    的头像 发表于 11-20 17:24 483次阅读
    开源鸿蒙技术大会2025丨<b class='flag-5'>编译</b>器与编程<b class='flag-5'>语言</b>分论坛:<b class='flag-5'>语言</b>驱动系统创新,<b class='flag-5'>编译</b>赋能生态繁荣

    汇编语言的起源

    一、汇编语言是什么? 我们知道,CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。 这些指令都是二进制的,称为操作码
    发表于 11-20 07:19

    C语言和单片机C语言有什么差异

    汇编语言机器才能读懂,所以每个平台的编译编译成对应平台汇编的程序,每个平台的汇编不一样,当然编译
    发表于 11-14 07:55

    蜂鸟E203能够仿真运行C语言程序吗?

    那两本书里面都是说怎么在FPGA上运行C语言程序和Benchmark程序,它提供仿真器下如何编译运行C
    发表于 11-06 06:21

    通过内联汇编调用乘法指令mulh\\mulhsu\\mulhu

    高32位 mulhsurd, rs1,rs2 将rs1当作有符号数,rs2当作无符号数相乘,取高32位 2.由于C语言中的乘法符号,在经过软件编译后生成的汇编指令位mul指令,
    发表于 10-24 06:52

    .elf 转换成.img 后,如何知道SPI flash 中的变量地址呢?

    它的 .map 中找到内存映射项目构建完成后的文件,如下图。 数据.abcDscr 0x40030b00 0x100 ./usbabc.o 但是.elf 转换成.img 后,如何知道SPI flash 中的变量地址呢?
    发表于 07-18 07:44

    汇编语言教学中文资料

    电子发烧友网站提供《汇编语言教学中文资料.rar》资料免费下载
    发表于 06-30 15:15 7次下载

    Windows环境下32位汇编语言中文资料

    电子发烧友网站提供《Windows环境下32位汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    EE-128:C语言中的DSP:C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的DSP:<b class='flag-5'>从</b><b class='flag-5'>C</b>调用<b class='flag-5'>汇编</b>类成员函数

    TMS320C6000汇编语言工具v7.4用户指南

    电子发烧友网站提供《TMS320C6000汇编语言工具v7.4用户指南.pdf》资料免费下载
    发表于 12-30 16:42 3次下载
    TMS320<b class='flag-5'>C</b>6000<b class='flag-5'>汇编语言</b>工具v7.4用户指南

    Triton编译器支持的编程语言

    Triton编译器支持的编程语言主要包括以下几种: 一、主要编程语言 Python :Triton编译器通过Python接口提供了对Triton语言
    的头像 发表于 12-24 17:33 1454次阅读