一起围读《RISC-V体系结构编程与实践 》第2篇 搭载硬件环境测一下指令
[复制链接]
这两天大概读了笨书的第三章第四章,趁着学习的热度,再回味一下之前的搭建硬件环境测试分析一下
学习了本书第三章 第四章的内容,下面我们搭建硬件环境,测试下RISC-V指令
Windows环境下搭建基于Eclipse + RISC-V gcc编译器的RISC-V开发环境,配合openocd调试软件,可以实现RISC-V内核程序的编译、下载和调试。
硬件选择GD的一款RISC-V芯片
创建工程,选用型号为GD32VF103
之前第一篇以为RISC-V就那么多指令呢,翻阅才知道第三章是基础指令集
还有很多其他指令集,需要我们去RISC-V指令集手册中找下
RV32G 指令集的 64 位版本 RV64G 指令集。要切换到 64 位 ISA, ISA 只添加了少数指令。指令集只添加了 32 位指令对应的字(word),双字(doubleword)和长整数(long)版本的指令,并将所有寄存器(包括 PC)扩展为 64 位。 因此,RV64I 中的 sub 操作的是两个 64 位数字而不是 RV32I 中的 32 位数字。 RV64 很接近 RV32但实际上又有所不同;它添加了少量指令同时基础指令做的事情与 RV32 中稍有不同。
这里我们主要看下乘法和余数指令
从RISC-V手册里能够找到指令。
之前正好做过GD的测评,但是很多汇编指令没有去深究,这次正好可以看看
二乘法测试
MULH[[S]U] rdh,rs1,rs2; MUL rdl,rs1,rs2
(源寄存器区分符必须按照同样的顺序,并且rdh不能是rs1或者rs2)。因此微体系结构可以将这些融合为一个单一的乘法操作,而不是执行两次分开的乘法。
LW(load word)指令格式为LW rd,offset(rs1)。x[rd] = sext ( M [x[rs1] + sext(offset) ] [31:0] )
该指令是从有效地址中读取四个字节(一个字,word),并写入rd寄存器。
再看下KEIL的仿真
看起来汇编指令基本上差不多的
二余数指令
取余指令CORTEX里没有找到指令
下图为RISC-V的
通过REMU指令实现
SDIV Rd, Rn, Rm ;Rd = Rn/Rm
MLS Rd, Rm, Rn, Ra ;Rd = Ra-Rm*Rn
CORTEX-M通过了除法和乘减指令一起实现的
CORTEX-M实现这个取余的思路大概就是,假设俩个数一个15 一个7,要得到取余的数,15/7=2 最后实现就是 15-7*2=1
RSIC-V通过一条REMU实现,比较快捷
总的来说RISC-V可扩展性很强,RISC-V是模块化指令,核心是RV32I的指令集,其他扩展模块可通过附加的方式进行扩展
|