如何把RISC-V的机器指令反汇编为汇编代码



现知道某条 RISC-V (指RV32)的机器指令在内存中的值为 b3 05 95 00(16进制),从左往右为从低地址到⾼地址,单位为字节,那么如何将其翻译为对应的汇编指令?



前置知识

  • RISC-V不管在32位CPU上还是在64位CPU上,其宽度都是32位,除非是压缩指令集模块
  • RISC-V的汇编指令在内存中按小端序排列
  • 在RV32中有32个通用寄存器,分别是x0~x31



正文

  • 由于b3 05 95 00是小端序的,所以需要反过来写,即00 95 05 b3
  • 转为二进制串【1】00000000-10010101-00000101-10110011
  • 根据RISC-V非特权指令手册手册24章中的基础指令集表和编码格式表

在这里插入图片描述


基础指令集表
在这里插入图片描述



编码格式表
在这里插入图片描述

  • 先根据最后一字节的后7位0110011,即opcode字段,在上表(基础指令集表)中的最后一列中寻找值为0110011的行,后可确定其编码格式为R-type类型
  • 根据下表(编码格式表)知,R-type类型中25-31位,12-14位为funct7字段和funct3字段
  • 在上表(基础指令集表)中的最后一列中寻找值为0110011的行,在根据funct7和funct3的值确定具体的某一行,即ADD指令所在的那一行,然后根据该行信息解析【1】的内容
  • 解析结果为0000000(funct7) 0-1001(rs2) 0101-0(rs1) 000(funct3) 0101-1(rd) 0110011(opcode)
  • 进一步转换为0000000 rs2=9 rs1=10 000 rd=11 0110011
  • 对应汇编指令为ADD x11, x10, x9



结果

在RV32中机器指令b3 05 95 00(16进制)反汇编后的汇编指令为ADD x11, x10, x9



参考


版权声明:本文为weixin_54430656原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。