如何区分RISC-V中jalr与beq指令的机器码
RISC-V jalr与beq指令识别答疑
首先纠正你前提中的错误:jalr和beq的opcode取值并不相同,处理器不存在对二者识别混淆的可能,也不需要依靠寄存器或立即数的取值范围做区分。
具体差异如下:
- 核心识别字段(opcode)不同
jalr属于I型跳转指令,固定opcode为1100111,funct3字段取值为000beq属于B型分支指令,固定opcode为1100011,funct3字段取值为000
处理器译码阶段优先读取opcode字段,只要该字段不同就会进入完全不同的译码分支,根本不需要比对后续字段就可以区分两类指令。
- 就算忽略opcode差异,二者的指令格式布局也完全不同
jalr的指令结构为jalr rd, offset(rs1),包含目的寄存器rd字段,立即数为12位I型连续编码立即数,不存在rs2字段beq的指令结构为beq rs1, rs2, offset,无目的寄存器rd字段,原本存放rd的位置被用作源寄存器rs2字段,立即数为13位B型拆分编码立即数
二者的字段排布逻辑完全不同,哪怕出现opcode相同的极端异常情况,也可以直接通过字段定义差异完成区分,不需要依赖寄存器编号或立即数的取值范围限制。
你产生误解的大概率原因是只注意到了二者funct3取值相同,忽略了opcode的差异。
内容的提问来源于stack exchange,提问作者Ace_of_King
相关产品推荐
相关产品推荐

