如何为Risc-V(汇编语言)编写旋转操作?我们有没有像8086中一样的命令?

时间:2019-03-28 09:28:06

标签: assembly riscv

我以前使用过8086的汇编语言,所以8086中的旋转操作只是一个命令。但是我找不到使用Risc-V汇编语言进行旋转操作的特定关键字。

2 个答案:

答案 0 :(得分:1)

似乎扩展名“ B”最终应定义这样的指令。

在此之前,您必须使用左移和右移进行组合。

这里等效于MIPS32R2 rotrv指令(按变量计数向右旋转):

rotrv:
    subu    neg_count, zero, count
    srlv    tmp1, src, count
    sllv    tmp2, src, neg_count
    or      dst, tmp1, tmp2

您可以在riscv上执行相同的操作。

答案 1 :(得分:1)

RISC-V基本指令集不包括旋转指令。

因此,您必须使用多个基本指令来实现旋转(又称为循环移位):

    .text
    .balign 4
# unsigned long rotl(unsigned long x, unsigned long amnt);
    .global rotl
rotl:
    sll  a2,   a0, a1
    sub  a4, zero, a1
    srl  a3,   a0, a4
    or   a0,   a2, a3
    ret
# unsigned long rotr(unsigned long x, unsigned long amnt);
    .global rotr
rotr:
    srl  a2,   a0, a1
    sub  a4, zero, a1
    sll  a3,   a0, a4
    or   a0,   a2, a3
    ret

请注意,sub a4, zero, a1绕回零,并且左移逻辑sll)仅使用{的低六位(RV64G)或五位(RV32G) {1}}作为移动量。

按立即数操作数移位时,GNU a4不会隐式截断移位量,因此必须显式屏蔽它,例如:

as

RISC-V Bitmanip Extension "B"规范草案的确包含一些附加的移位和随机播放指令,包括左右旋转:

# unsigned long rotl3(unsigned long x);
    .global rotl3
rotl3:
    slli a2, a0,  3
    srli a3, a0, (-3 & 63) # & 31 for RV32G
    or   a0, a2, a3
    ret
# unsigned long rotr3(unsigned long x);
    .global rotr3
rotr3:
    srli a2, a0,  3 
    slli a3, a0, (-3 & 63) # & 31 for RV32G
    or   a0, a2, a3
    ret     
    .global rotl

({RISV-V Bitmanip Extension V0.92,第2.2.1节,第14页)

当然,从2020年开始,由于草案的状态,bitmanip指令及其编码可能会更改,并且对软件工具链,模拟器和硬件中的“ B”扩展的支持还不广泛。