RISC-V汇编基础的三大块知识
2023-06-16
作者: 李肯
来源:架构师李肯
1 前言
玩嵌入式的,或多或少都接触ARM。
但是近些年随着科技的发展,CPU的架构家族中,新增了一个叫RISC-V的家伙。
RISC-V(读作“RISC-FIVE”)是基于精简指令集计算(RISC)原理建立的开放指令集架构[1](ISA),V表示为第五代RISC(精简指令集计算机[2]),表示此前已经四代RISC处理器原型芯片。每一代RISC处理器都是在同一人带领下完成,那就是加州大学伯克利分校的David A. Patterson教授。与大多数ISA相反,「RISC-V ISA可以免费地用于所有希望的设备中,允许任何人设计、制造和销售RISC-V芯片和软件」。它虽然**不是第一个开源的的指令集(ISA)**,但它很重要,因为它第一个被设计成可以根据具体场景可以选择适合的指令集的指令集架构。基于RISC-V指令集架构可以设计服务器CPU[3],家用电器cpu,工控cpu和用在比指头小的传感器中的cpu。
更多详细介绍,请参考百度百科[4],RISC-V简介[5].
2 RISC-V知识图谱
本文先列个大纲,后续有时间再补充。
3 RISC-V汇编基础三大块
这里整理了RISC-V汇编中非常基础的三大块知识,了解了这三大块内容基本可以看懂甚至编译一些简单的汇编程序。
3.1 寻址方式
RISC-V分支指令寻址,在之前的B类型指令就是其中之一。这种格式可以表示从-4096到4094的分支地址,以2的倍数表示。B型格式包括一个7位操作码、一个3位功能码、两个5位的寄存器操作数( rs1和 rs2)和一个12位地址立即数。该地址使用特殊的编码方式,简化了数据通路设计,但使组装变得复杂。下面这条指令
其中条件分支的操作码是11001112,而bne 的funct3码是0012 RISC-V的无条件跳转–链接指令(jal),是分支寻址的另一种方法,也是唯一使用J型格式的指令。该指令由一个7位操作码、一个5位目标寄存器操作数(rd)和一个20位地址立即数组成。链接地址,即jal之后的指令的地址,被写入rd 中。
如果程序的地址必须适合这个20位字段,则意味着没有程序可能大于220,所以另一种方法是指定一个与分支地址偏移量相加的寄存器,这样就允许程序大到264,并且仍然能够使用条件分支指令,以便分支指令可以按如下来计算:
程序计数器=寄存器内容+分支地址偏移量 这样就允许程序大到2^64,并且仍然能够使用条件分支指令
立即数寻址,操作数是指令本身的常量。寄存器寻址,操作数在寄存器中。基址或偏移寻址,操作数于内存中,其地址是寄存器和指令中的常量之和。PC相对寻址,分支地址是PC和指令中常量之和。注: 「加载和存储对字节、半字、字或双字的访问有不同的版本」。
3.2 寄存器的用途
3.2.1 RISC-V的寄存器列表
3.2.2 RISC-V寄存器在汇编代码中使用
3.3 汇编指令
RISC-V有六种基本指令格式:
R 类型指令,用于寄存器-寄存器操作I 型指令,用于短立即数和访存 load 操作S 型指令,用于访存 store 操作B 类型指令,用于条件跳转操作U 型指令,用于长立即数J 型指令,用于无条件跳转
3.3.1 其他
本人有RISC-V相关的学习资料若干份,这些都是非常经典使用的学习材料,感兴趣的可以扫码VX联系我。
4 更多分享
欢迎关注我的github仓库01workstation[6],日常分享一些开发笔记和项目实战,欢迎指正问题。
同时也非常欢迎关注我的CSDN主页和专栏:
【CSDN主页:架构师李肯】[7]
【RT-Thread主页:架构师李肯】[8]
【C/C++语言编程专栏】[9]
【GCC专栏】[10]
【信息安全专栏】[11]
【RT-Thread开发笔记】[12]
【freeRTOS开发笔记】[13]
【BLE蓝牙开发笔记】[14]
【ARM开发笔记】[15]
【RISC-V开发笔记】[16]
有问题的话,可以跟我讨论,知无不答,谢谢大家。
5 参考链接
RISC-V 生态架构浅析[17]
RISC-V寄存器[18]
RISC-V指令[19]
以上参考资料,由本人整理,但来源于网络,侵删!