RISC-V编译流程及汇编设计


一、编译过程?

1.预处理

预处理主要包括:

  1. 将所有的#define删除, 并展开所有的宏定义,处理所有的条件预编译指令, 比如#ifdef、#ifndef、#else 和#endif;
  2. 处理#include预编译指令,将被包含的文件插入该预编译指令的位置。
  3. 删除所有注释“//”和“/××/”。
  4. 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  5. 保留所有的#pragma编译器指令, 后续编译过程需要使用它们。

2.编译

编译过程就是对预处理完的文件进行一系列的词法分析、语法分析、语义分析及优化后生成相应的汇编代码。即编译器将C程序转换为机器能理解的符号形式-汇编语言程序(assembly language program)。高级语言程序比汇编语言使用更少的代码行,因此程序员的工作效率更高。为了防止编译器优化掉必要的操作可添加关键词“volatile”。

volatile uint8_t isr_flag;

3.汇编

汇编过程调用对汇编代码进行处理, 生成处理器能够识别的指令, 保存在后缀为.o的目标文件中。当程序由多个源代码文件构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进入下一步的链接工作。目标文件已经是最终程序的某一部分了,但是在链接之前还不能执行。
目标文件(.o)为ELF(executable and linkable format)格式的可重定向文件,不能以普通文本的形式查看(vim编辑器打开看到的是乱码)。

4.链接

链接是将各种代码和数据片段收集组合成为一个单一文件的过程(换句话说就是将所有独立汇编的机器语言程序“缝合”在一起),这个文件可被加载到内存并执行。经过汇编以后的目标文件还不能直接运行, 为了变成能够被加载的可执行文件, 文件中必须包含固定格式的信息头, 还必须与系统提供的启动代码链接起来才能正常运行。(运行链接器程序ld, 将.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件),目标文件是按照特定的目标文件格式来组织的,各个系统的目标文件格式都不相同,从贝尔实验室诞生的第一个Unix系统使用的是a.out格式(直到今天,可执行文件仍然称为a.out文件)。现代Linux和Unix系统使用可执行可链接格式(ELF)。不管哪种格式,基本概念是相似的。

二、C语言与汇编

1.C语言的优化

如果将未经优化的C语言程序直接运行会发现运行效率较低,并且产生的代码较大,而通过优化可以较好地解决这些问题。优化的作用是循环进行化简,重新组织表达式和声明,将变量直接分配到寄存器中。通过优化可以提高程序运行效率,缩小程序编码数量。C/C++编译器提供了不同的优化选择,通过修改参数选择不同的优化等级。优化器分析数据流时将尽量减少对内存的访问,如果这个数据必须从内存中得到,则该数据必须用volatile关键字定义,这样可以使编译器不对该变量进行优化。

例如声明一个指针
unsigned int *ddr_ptr;
当在循环中有如下语句时
while(*ddr_ptr != 0xFF) ;

优化器将只在进入循环的初始化中进行一次内存读,而在循环当中不在更新该变量的内容,如果该变量被中断或其它程序改变,由于循环中变量ddr_ptr的值没有更新,将会使程序不能按照正确的方式执行,这里应当采用如下写法:

volatile unsigned int *ddr_ptr;

特别当该变量在中断函数中被赋值,而该变量在主函数的循环中被用到时,必须用volatile声明该变量。

2.C语言中直接嵌套汇编

采用直接嵌套汇编语句的方法比较适合完成对硬件进行操作、设置状态寄存器、开关中断等工作,这样往往要比使用C语言实现效率更高,在C语言代码中直接嵌套汇编语句十分简单,只需在嵌入的汇编语句前面加上asm表示符,左右加上一个双引号和一个小括号即可。

asm volatile("nop");
asm volatile("ecall");

采用直接嵌套的方法要十分小心,这是因为C语言编译器并不检查和分析所嵌入的汇编语句,而嵌入的语句很可能改变C语言的运行环境。如果采用嵌套汇编语句,在编译程序时不应采用优化功能,采用优化功能可能会调整汇编语句周围代码的排列顺序,有可能改变程序的运行结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值