我还是RISC-V和汇编代码的新手。我想要命令的操作码/二进制值。但这使我感到困惑:A.不同页面列出了命令的不同操作码,而B. 10个命令具有相同的操作码。我怀疑对B的要求是不同的命令描述了相同的机制,但是我仍然不确定哪些操作码是正确的。
来源: https://github.com/riscv/riscv-opcodes/blob/20e4f0285c563e5a403bd6ba735beadbbd3c203e/opcodes 添加rd rs1 rs2 16 = 0 15..10 = 0 9..7 = 0 6..2 = 0x0C 1..0 = 3
来源: https://content.riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf 0110011添加
那么为什么在github页面上说ADD的操作码是0C,十进制是12,而0110011 ist 51是十进制?
问候。
答案 0 :(得分:0)
前7位代表指令的操作码。 github源和pdf都列出了相同的ADD操作码。 0x0C = 0000_1100二进制但是github来源说5位(6..2),所以0x0C = 01100二进制。任何有效操作码的前2位始终为11二进制。将01100 11连接在一起,您将获得0110011二进制,51十进制。
视觉上(按左移然后是OR):
01100 11 -> ADD Opcode
----- --
0x0C 3 -> 0x0C << 2 | 3 -> 12*4 + 3 = 51
具有相同操作码(例如BEQ和BNE)的指令(都具有操作码1100011 = BRANCH)将具有另一个字段,该字段进一步定义了指令的功能。因此,BRANCH操作码1100011将所有分支指令分组。要区分BEQ(等于分支)与BNE(等于分支),您必须查看funct3字段。 BEQ的funct3 = 000,BNE的funct3 = 001。 funct3字段将唯一地标识BRANCH(1100011)指令的功能:BEQ,BNE,BLT,BGE,BLTU,BGEU)。
某些指令(例如LUI)由操作码唯一标识,因此不需要funct3字段。其他指令(例如带有OP(0110011)操作码的指令)需要funct3字段和funct7字段。注意,ADD和SUB都具有相同的操作码(OP = 0110011)以及相同的funct3(000),因此funct7字段是区分符。 ADD的funct7为0000000,而SUB的funct7为0100000。
RISC-V Spec第19章的开头显示了一个表,其中包含所有有效的OPCODES及其二进制值。请记住,每个OPCODE的前2位是11,从表中将其省略。例如,看表查找STORE,如果我们想知道STORE的操作码,则向左扫描到inst [6:5]列,然后找到01。从STORE向上扫描到inst [4:2]行,然后找到000。由此我们可以构造STORE操作码01 000 11->0100011。所有STORE指令(SB,SH,SW)的操作码都将为0100011。要确定指令是SB,SH还是SW,请查看funct3字段000 = SB,001 = SH,010 = SW。