浮点寄存器 (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“基本指令格式”所示。那里的图表显示 rs1、rs2 和 rd 是位 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 你正在使用,为了你自己的理智...
整数寄存器编码对应于它们的数字名称(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“基本指令格式”所示。那里的图表显示 rs1、rs2 和 rd 是位 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 你正在使用,为了你自己的理智...