打印
[RISC-V MCU 应用开发]

RISC-V之乘除法指令

[复制链接]
1970|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
指令格式
RV32M 具有有符号和无符号整数的除法指令:divide(div)和 divide unsigned(divu),它们将 商放入目标寄存器。在少数情况下,程序员需要余数而不是商,因此 RV32M 提供 remainder(rem)和 remainder unsigned(remu),它们在目标寄存器写入余数,而不是商。

为了正确地得到一个有符号或无符号的 64 位积,RISC-V 中带有四个乘 法指令。要得到整数 32 位乘积(64 位中的低 32 位)就用 mul 指令。要得到高 32 位,如果 操作数都是有符号数,就用 mulh 指令;如果操作数都是无符号数,就用 mulhu 指令;如 果一个有符号一个无符号,可以用 mulhsu 指令。在一条指令中完成把 64 位积写入两个 32 位寄存器的操作会使硬件设计变得复杂,所以 RV32M 需要两条乘法指令才能得到一个完整 的 64 位积。

用乘法代替常数除法
对许多微处理器来说,整数除法是相对较慢的操作。如前述,除数为 2 的幂次的无符号 除法可以用右移来代替。事实证明,通过乘以近似倒数再修正积的高 32 位的方法,可以优 化除数为其它数的除法。例如,图 4.3 显示了 3 为除数的无符号除法的代码。


先把数装到t0里面
addi是立即数与寄存器的数相加, t0-1365放回t0
a0和t0相乘(无符号)
立即数→移,也就是a1右移1位
也就是说从数值上来讲,可以通过乘法代替常数除法


使用特权

评论回复

相关帖子

沙发
LOVEEVER| | 2023-11-29 20:00 | 只看该作者
整数除法是相对较慢的操作

使用特权

评论回复
板凳
xdqfc| | 2023-12-20 10:57 | 只看该作者
用左移代替除法的,只能除以固定数,假如除数是变量的话,也玩不起来,再说,假如单片机本身就带除法指令的,根本就不需要用左移,就一条除法指令就可以,短的几个时钟周期就搞定,比起左移加乘法,速度并不慢。

使用特权

评论回复
地板
xdqfc| | 2023-12-20 11:01 | 只看该作者
LOVEEVER 发表于 2023-11-29 20:00
整数除法是相对较慢的操作

M0因为没有除法指令,所以经常用左移加乘法来代替除法,这样速度较快,但是仅仅除数是固定数,假如是变量还是不行,现在大部分单片机都有除法指令,根本不需要这样玩了,一条指令就可以,速度根本就不慢。

使用特权

评论回复
5
在线DIY23| | 2023-12-21 16:46 | 只看该作者
如果要是做乘除操作的话,我认为移位操作更好一些。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1189

主题

5192

帖子

12

粉丝