如何提取 Risc v 汇编代码中的位

How can I extract bits in Risc v assembly code

寄存器 x5 存储 0x00C0_C000,寄存器 x6 存储 0x0000_C0000。这时,你想把x5寄存器的[15:8]位的值取出来,放到x6寄存器的[31:16]位中。完成 RISC-V 汇编代码来执行此操作。但是,x5 和 x6 的其他位应该不会改变。

将x5寄存器中的x6[31:16]位替换为[15:8]的8bit,但8bit与[31:16]位的低位对齐

我想我应该使用 sllisrli 来提取位。但是使用它们,x5 和 x6 的另一位发生了变化。如何在不更改其他位的情况下提取位?

我会提供下一个解决方案,我使用 0x00debc00 以便于查看: 对于 RV64I

lui a1,0xDEB     # loads 0x00deb of 0x00debc00
li a2,0xC00      # loads 0xc00 of 0x00debc00
add a1,a1,a2     # stick together 0x00deb + c00 = 0x00debc00
slli a3,a1,48    # took 0x00de"bc"00 and moves to left corner to clean unnecessary bits
srli a4,a3,48    # move "bc" back into 0xbc00
xor a1,a1,a4     # use 0xbc00 for masking initial 0x00debc00 and get 0x00de0000
srli a3,a3,32    # move 0xbc from left corner of $a3 to it's place 0x0000bc00
add a1,a1,a3     # concatenate it all - voila! 0xbcde0000

也许更简单,但我还不是魔术师)

对于 RV32I,您应该少向左移动:

lui a1,0xDEB
li a2,0xC00
add a1,a1,a2
slli a3,a1,16
srli a4,a3,16
xor a1,a1,a4
#srli a3,a3,32 no need to move back its already in it's place
add a1,a1,a3

抱歉“英语”。

您想做的是: 如果不确定 x6 始终等于 0,则清除 x6 的高位部分。您可以使用掩码来完成:

li x28,0xffff
and x6,x6,x28

slli x6,x6,16
srli x6,x6,16

由于无法修改x5,需要使用其他tmp寄存器:

mv x28,x5

从[15:8]位取8,放入[31:16]

srli x28,x28,8
andi x28,x28,0xff
slli x28,x28,16

最后你做一个或将这些位放在 x6 中:

or x6,x6,x29

也试着看看 https://raw.githubusercontent.com/riscv/riscv-bitmanip/master/bitmanip-0.90.pdf。 RISC-V Bitmanip 扩展如果受支持会很有趣。