关注+星标公众,不错过精彩内容

来源 | CSDN

原文:

https://blog.stephenmarz.com/2021/05/12/tips-to-writing-assembly/

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

嵌入式专栏

1

用合适的语言设计逻辑

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

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

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

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

嵌入式专栏

2

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

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

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

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

嵌入式专栏

3

了解汇编语言的功能定位

这里我们必须要充分认识到没有汇编语言和有编译器解释器的高级语言真的完全不一样,不养儿不知父母恩,不写汇编不知各类语言之父有多神。在汇编语言中操作顺序都需要程序员自己去掌握。

例如,4+3*4 的运算,作何一种语言的编译器都先执行乘法,然后再加法。然而在汇编语言的编程世界中,我们必须首先选择乘法指令,然后再选择加法指令。没有为我们进行运算符号的优先级重排。

嵌入式专栏

4

了解如何调用函数

在汇编语言中编写一个函数是一项非常艰苦的任务,大多数 ISA 体系结构(如ARM和RISC-V)的芯片都将附带专门的工作手册,当然这些手册中只是制定了一些基本规则,如何传递参数,如何接收返回结果,又如何构造函数栈祯等等具体的话题都值得深入讨论。

不过幸运的是 RISC-V 寄存器的 “ABI” 命名规则,有助于程序员理解它们的含义。比如:

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

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

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

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

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

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

以下面这段代码为例:

.global main
main:
addi    sp, sp, -8
sd      ra, 0(sp)
la      a0, test_solve
call    solve
mv      a0, zero
ld      ra, 0(sp)
addi    sp, sp, 8
ret

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

嵌入式专栏

5

文档

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

# used |= 1 << ( x[i * 9 + col] - 1)li      t0, 9mul     t1, s3, t0          # t1 = i * 9add     t1, t1, s2          # t1 = i * 9 + colslli    t2, t1, 2           # Scale by 4add     t2, t2, s6          # x + i * 9 + collw      t3, 0(t2)           # x[i * 9 + col]addi    t3, t3, -1          # x[i * 9 + col] - 1li      t4, 1sll     t4, t4, t3          # 1 << x[i * 9 + col] - 1or      s5, s5, t4          # used |= ...

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

免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------

后台回复『单片机』『电子基础』相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

新手 RISC-V 编程的几点内容相关推荐

  1. RISC V (RV32+RV64) 架构 整体介绍

    文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...

  2. 零基础怎样自学编程?新手如何学习编程?编程学习入门指南

    对于编程,很多新手的第一感觉可能就是: 高深,难学. 学好编程,有的时候,可以把一些需要我们重复劳动的工作,自动化批量处理,为我们节省很多时间和精力. 对于一些学得比较深入的朋友来说,更是可以通过它找 ...

  3. php编程好学不,PHP编程一般学哪些内容 PHP编程好学吗

    PHP编程好学吗?PHP编程一般学哪些内容? PHP编程应用极广,现在的大型网站,海量的WEB应用基本上都是PHP开发的.PHP是非常适合新手入门学习的编程语言,可见PHP编程并不难学.如果要成为一名 ...

  4. 计组学习笔记2(RISC v版)

    指令集解释 (规定:R[r]表示通用寄存器r的内容,M[addr]表示存储单元addr的内容,SEXT[imm]表示对imm进行符号扩展,ZEXT[imm]表示对imm进行零扩展) 整数运算类 -U型 ...

  5. 在jupter中利用Python编程查看pkl文件内容的步骤

    pkl文件是python保存文件的一种格式. 下面以 test.pkl 文件为例,展示在jupter中利用Python编程查看pkl文件内容的步骤. 一.查看Python代码所在的文件夹 import ...

  6. 零基础新手自学Python编程教程入门精通学习资料网站大全

    零基础新手自学Python编程教程入门精通学习资料网站大全 今天说下关于Python的一些普及知识,以及学习资料,这一节我来跟大家分享下. 1 为什么要学习Python? 1 Python是一个脚本语 ...

  7. python是什么编程教程-一个新手,什么编程都没学过怎么学好Python?

    可以参考一下<笨办法学Python 3>中的笨办法,希望以下方法可以帮忙到你. 在本书的帮助下,你将通过完成下面这些非常简单的事情来学会一门编程语言,这也是每个程序员的必经之路. 1.从头 ...

  8. 新手程序猿编程实战项目推荐「附源码下载」

    知识更新那么快,跟随不上怎么办?碎片信息那么多,选择恐惧怎么办?别担心,我用心挑选了几个实战项目.长期推送干货.职场心得,让你收获满满. 复制代码 仿今日头条客户端 小白学习编程,最简单的就是手撸一个 ...

  9. 怎么提高python编程水平_编程新手如何提高编程能力?

    有些朋友给我留言说,兴致满满的开始自学编程,但是拿到一堆书,却不知道从哪开始,最后的结果就像下面这个图: 下面结合我之前的学习经历,如何从零基础慢慢提高. 1.首先,给你的学习编程一个重要的意义 做任 ...

  10. 零基础新手小白学编程必会的100个代码

    前言 我记得刚开始接触编程的时候,觉得太难了. 也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧? 他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会有影响. ...

最新文章

  1. StringUtils
  2. c++ 小游戏_C/C++编程新手入门基础系列:俄罗斯方块小游戏制作源代码
  3. jsoncpp学习笔记
  4. STM32-SPI通信
  5. flask v0.1 路由
  6. Oracle从非归档模式变成归档模式
  7. Visual Studio 2010添加新项缺失[ADO.NET 实体数据模型]解决方法
  8. 恐龙母带混音插件-IK Multimedia T-RackS 5 MAX 5.5.1 macOS
  9. php 中文转拼音(包括部分生僻字)
  10. 什么是原码,1’s Complement Code反码和2’s Complement Code补码
  11. Ubuntu上安装Chrome浏览器
  12. 手撕栈,栈的实现(C语言)
  13. 弧齿锥齿轮零件图_弧齿锥齿轮画法类别
  14. DIY M328晶体管测试仪 挖坑 填坑
  15. 怎样搜索计算机文档,怎么样快速搜索电脑文件 Windows系统秒搜电脑文件
  16. win7+Linux(centos 7.2)双系统--总结
  17. 大商创如何重置或修改商家店铺登录密码?
  18. SSL证书背后的加密技术--非对称加密和对称加密
  19. 荒野求生获得服务器信息,荒野求生游戏问答老贝出海时任务编码 | 手游网游页游攻略大全...
  20. 快速用php做oa,有了PHPOA移动OA系统,轻松实现商务快速响应

热门文章

  1. linux键盘输入空格失效,电脑键盘空格键失灵不能用如何修复
  2. vscode-图片压缩
  3. C语言逻辑运算符,位运算符总结
  4. coreldraw怎么改成半圆形_cdr怎么把图形修剪成指定的形状?
  5. 【微信小程序】针对测试号获取openid报错40125错误的解决方案
  6. 每日学习, 特征方程的复根
  7. 雷电模拟器连接Android,1.AS连接雷电模拟器
  8. Element-UI下拉框select实现拼音搜索
  9. 小米路由器4C刷机(以OpenWrt为例)
  10. 双三次插值算法(bicubic interpolation)与图形学和计算方法的关系