浮点寄存器 (f0-f31) 的 rs1 和 rs2 字段如何在 RISC-V 指令中编码?

How are rs1 & rs2 fields for floating point registers (f0-f31) encoded in RISC-V Instructions?

整数寄存器编码对应于它们的数字名称(0-31,对于x0-x31)。 f0-f31 的编码是什么?

我正在尝试编写反汇编程序。

浮点寄存器的编码方式相同。处理器根据指令的性质知道是使用整数寄存器还是浮点寄存器。

RISC-V 规格在 https://riscv.org/specifications/。作为一种指令类型的示例,RISC-V 指令集手册,第一卷:用户级 ISA,2.2 版,2017 年 5 月 7 日,第 8.6 节,“单精度浮点计算指令”说:

Floating-point arithmetic instructions with one or two source operands use the R-type format with the OP-FP major opcode. FADD.S, FSUB.S, FMUL.S, and FDIV.S perform single-precision floating-point addition, subtraction, multiplication, and division, respectively, between rs1 and rs2, writing the result to rd.

R 型格式如 2.2“基本指令格式”所示。那里的图表显示 rs1rs2rd 是位 19 到 15、24 到 20,和 11 到 7,分别。

所以有几件事 1) 有 risc-v 文档。 2) 如果你正在为一个指令集编写第一个 assembler 或 disassembler,那么你就在那里工作,你可以去一个硅工程师立方体并询问。 3) 如果没有,那么这个指令集有工具,你应该把它们作为参考:

获取 risc-v 文档:

.word 0x001100D3
.word 0x002100D3
.word 0x003100D3
.word 0x001100D3
.word 0x001200D3
.word 0x001300D3
.word 0x00130153
.word 0x00130253
.word 0x00130353

assemble 然后disassemble

   0:   001100d3            fadd.s  f1,f2,f1,rne
   4:   002100d3            fadd.s  f1,f2,f2,rne
   8:   003100d3            fadd.s  f1,f2,f3,rne
   c:   001100d3            fadd.s  f1,f2,f1,rne
  10:   001200d3            fadd.s  f1,f4,f1,rne
  14:   001300d3            fadd.s  f1,f6,f1,rne
  18:   00130153            fadd.s  f2,f6,f1,rne
  1c:   00130253            fadd.s  f4,f6,f1,rne
  20:   00130353            fadd.s  f6,f6,f1,rne

然后用助记符写代码,重复。根据 ISA 文档结合现有工具开发您的 disassembler,轮流执行此过程,直到您对您的工具感觉良好为止。预计文档中有错误或含糊不清...

当然,在这种情况下,人们希望 gnu 使用一种类似于 risc-v 的汇编语言,人们希望得到示例和文档。 GNU 有不这样做的习惯。同时,如果您正在编写 disassembler 而不是 assembler 或完整的工具链,那么您应该使 disassembler 与 assemble 的语法相匹配r 你正在使用,为了你自己的理智...