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

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

3天内不再提示

初学RISC-V编程的技巧

我快闭嘴 来源:CSDN 作者:马超 2021-06-12 15:44 次阅读

如果编程本身就是一门艺术,那么汇编语言的编程就是编程领域中的皇冠,在这个基础软件全面回归的时代,汇编语言似乎再次焕发了青春,根据 TOBIE 发布的编程语言排行榜,汇编语言重回前十,虽然这是 X86、ARM单片机等等所有平台的汇编语言加在一起才取得的成果,不过在印象中上次汇编语言取得这样的成绩还是上个世纪 90 年代的事。

初学RISC-V编程的技巧

汇编语言对于操作系统,数据库,人工智能框架等核心基础软件有着不可取代的作用,从了解到的情况看,比如龙芯对于 OpenJDK 的贡献已经达到了全球前五名,这其中最为关键的贡献方向就是将 Java 虚拟机针对 Looongarch 指令集进行专项优化,可以说熟练掌握一种汇编语言是高阶程序员的必经之路。

当用户使用 C、C++ 或任何其他高级语言时,编译器决定了程序的艺术。然而这一次,我们将自行面对 CPU,新手实现面向指令集编程的艺术,本文使用RISC-V 为例来向大家展示,来如何使用编写语言设计程序逻辑,并最终将程序逻辑转换为汇编语言的程序。

译者对于原文进行了一定的修订与校对。

1、用合适的语言设计逻辑

对于初学者来说,这是最难的一步,因为现在学生们常用的高级语言中,往往使用更抽象的工具进行逻辑设计,许多学生想直接编写完整的功能模块。但是对于汇编语言来说,这是一种注定要失败的方法。相反,为了把逻辑和语言分开,我们必须用我们理解的语言来设计程序逻辑。

如果一个学生不懂 C 或一些低级语言,那么我建议他们用伪码写。因为用太高级的语言如 Java 其实是面向虚拟机编程的,这会增加程序逻辑到汇编语言的转换难度,而使用太低级的语言会使程序逻辑设计变得困难。因此,我推荐 C 或 C++,在将代码进行转换的时候,最好将有对应的代友横向放在一起,一些编辑可以把它们并排放在一起,这是很有帮助的。

说实话这部分虽然看似平平无奇,但却让我颇感到意外,因为 C 语言和汇编的对照完全可以通过 gcc 的 -o -g 参数以及 objdump 实现。

初学RISC-V编程的技巧

在译者的理念中,汇编语言是专门用于填补空白,只有当其它语言不能胜任的时候才会考虑用汇编语言上场工作,不过从这篇博文中透露出的信息来看,国外在教学过程中对于汇编语言的运用范围也是不设限的,而在译者印象中能用汇编语言实现任何功能的程序员,在国内只有求伯君,严援朝等廖廖数人而已,由此可见我们在 IT 基础教育领域要做的工作还很多。

2、小步快跑,不要试图一口吃个胖子

很多汇编语言的初学者试着从头到尾写完整的程序,而没有在中间进行过任何测试关键,但是我建议在完成部分逻辑时就立刻进行测试。这样做其实很简单,比如完成了一个 for 循环,等等一小部分功能就要开始测试。

可以将 C 或 C++ 程序与汇编程序连接起来。通过在 C++ 中原型化组装函数的名称实现这一点。按照一般的做法通常会在 C 函数前面加上一个 “c” 来区分。我们可以调用 Show 来运行汇编语言编写的函数。

其实这部分的建议并不仅仅针对于 RISC-V 甚至不是针对汇编语言,无论是什么语言的编程,当你想到要进行单元测试的时候往往就已经晚了,随时对于一个细小的模块进行测试真的是一个好习惯。

3、了解汇编语言的功能定位

这里我们必须要充分认识到没有汇编语言和有编译器解释器的高级语言真的完全不一样,不养儿不知父母恩,不写汇编不知各类语言之父有多神。在汇编语言中操作顺序都需要程序员自己去掌握。例如,4+3*4 的运算,作何一种语言的编译器都先执行乘法,然后再加法。然而在汇编语言的编程世界中,我们必须首先选择乘法指令,然后再选择加法指令。没有为我们进行运算符号的优先级重排。

4、了解如何调用函数

在汇编语言中编写一个函数是一项非常艰苦的任务,大多数 ISA 体系结构(如ARM和RISC-V)的芯片都将附带专门的工作手册,当然这些手册中只是制定了一些基本规则,如何传递参数,如何接收返回结果,又如何构造函数栈祯等等具体的话题都值得深入讨论。不过幸运的是 RISC-V 寄存器的 “ABI” 命名规则,有助于程序员理解它们的含义。比如:

整数参数在寄存器 A0-A7 中,浮点参数在寄存器 FA0-FA7 中

通过对堆栈指针的 sub 操作去分配函数堆栈。在调用完成后使用 add 操作进行销毁

堆栈大小必须以 8 的整数倍形式分配

所有参数和临时寄存器必须在函数调用后,被视为销毁态

在函数调用之后,已保存寄存器才能被显式保存。如果使用了任何已保存的寄存器,则必须在函数返回之前还原它们的原始值

通过 a0 寄存器做为返回值,将数据返回给调用方。

以下面这段代码为例:

初学RISC-V编程的技巧

我们可以看到先通过 addi sp,sp,-8 的语句构造函数祯,保存所有寄存器后执行相应函数逻辑,接下来将所有包括sp寄存器内的调用环境恢复,最后返回。

5、文档

建议使用 C 或其他语言编写汇编语言的注释,用以下代码为例:

初学RISC-V编程的技巧

原始 C 语言代码进行一个总的注释,然后将每个汇编语言片段的也使用 C 语言进行注释。尤其当涉及到运算操作顺序时,这样的方式使我们能够保证程序可以正确地执行每一步。

责任编辑:tzh

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

    关注

    68

    文章

    10442

    浏览量

    206544
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92387
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48610
  • RISC-V
    +关注

    关注

    41

    文章

    1901

    浏览量

    45044
收藏 人收藏

    评论

    相关推荐

    什么是RISC-V

    siFive搞RISC-V 赛昉搞RISC-V 香山搞RISC-V 到底什么是RISC-V? 先不问有什么用,RISC-V目前的能力来说,工
    发表于 02-02 10:41

    为什么选择RISC-V

    RISC-V是一种开放式ISA(指令集体系结构),为处理器体系结构的创新开创了新纪元。RISC-V基金会由325多家成员公司组成。这是该技术的主要优势。软件架构师/固件工程师/软件开发
    发表于 07-27 17:38

    科普RISC-V生态架构(认识RISC-V)

    功能,并与现有软件及编程语言可良好适配。PS:伯克利大学世界大学排名世界第4、世界大学学术排名世界第5。发展RISC-V产业生态正进入快速发展期。加州大学伯克利分校在2015年成立非盈利组织
    发表于 08-02 11:50

    可对任何RISC-V系统进行直接编程

    SEGGER推出了新的Open Flashloader,可对任何RISC-V系统进行直接编程德国莱茵河畔蒙海姆– 2021年1月29日SEGGER刚刚发布了用于RISC-V系统的新型Open
    发表于 03-09 19:35

    RISC-V是什么?如何去设计RISC-V处理器?

    RISC-V是什么?有哪些特点?如何去设计RISC-V处理器?
    发表于 06-18 09:24

    RISC-V是什么

    (刚刚投入芯片行业学习的新人,存在理解错误的地方欢迎指出,并探讨,还请多多包涵,谢谢!) RISC-V是区别于 INTEL x86架构、arm架构的另一种芯片内核架构。 RISC-V,主要区别于当代
    发表于 07-23 06:06

    什么是RISC-VRISC-V指令具有哪些特点应用?

    什么是RISC-VRISC-V指令具有哪些特点应用?自己怎么才能设计出设计一套指令集?
    发表于 10-14 09:05

    RISC-V嵌入式开发的特点有哪些

    RISC-V处理核,很多初学者留言询问有关RISC-V工具链使用的问题,因此本公众号将开始陆续发表若干篇有关RISC-V软件工具链使用的文章,包括:
    发表于 11-08 08:33

    RISC-V简介

    RISC-V简介  RISC-V 是一个自由和开放的 ISA(开源指令集架构),通过开放的标准协作实现处理器创新的新时代。RISC-V ISA在架构上提供了一个新的自由、可扩展的软件和硬件自由级别
    发表于 02-27 19:56

    初探RISC-V—《RISC-V体系结构编程与实践》

    最近有幸读了一本介绍RISC-V的书籍《RISC-V体系结构编程与实践》,这是一本非常有价值的书籍,它介绍了RISC-V体系结构的各个方面,包括指令集、寄存器、内存管理、中断等等。在阅
    发表于 03-28 11:41

    risc-v是什么意思

      risc-v是什么意思  RISC-V是一种指令集  RISC-V,一般被念做:risk five。V,即罗马数字5。该指令集是RISC
    发表于 03-30 16:40

    RISC-V体系结构编程与实践》试读

    本书详细地介绍了RISC-V的基本原理、指令集、编程工具和环境、体系结构和扩展以及应用案例和实践等方面的内容,覆盖了RISC-V体系结构的各个方面,使读者能够全面深入地了解RISC-V
    发表于 04-03 15:15

    RISC-V架构

      RISC-V架构  RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。  与大多数指令集相比,RISC-V指令集可以自由地
    发表于 04-03 15:29

    RISC-V 发展

    RISC-V 发展2015年成立了RISC-V基金会,这是个非营利性组织,主要为了维护和发展RISC-V。目前RISC-V的IP供应商大部分是国内的厂商,例如sifive、阿里平头哥、
    发表于 04-14 10:18

    关于学习RISC-V的方法问题

    最近看到很多人和论坛都在讨论RISC-V,怎么说也要赶上潮流吧,请问各位大佬,如果作为一名初学者,要学习RISC-V,有什么好的学习方法和资料推荐呢?谢谢。
    发表于 04-14 21:53