队伍编号:CICC1974
队伍名称:812创新实验小组
硬件设计需要.verilog文件来运行加NICE后的tb仿真、软件组需要.dasm来确定自定义指令有无被正确编译。今天,我们来分享一下NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件中自定义指令反汇编结果分析。
一、如何生成.verilog和.dasm文件文件
项目右键选择Properties
选择C/C++ Build下面的Setting
更改build的指令
反汇编:
riscv-nuclei-elf-objdump -d “${BuildArtifactFileBaseName}.elf” > “${BuildArtifactFileBaseName}.dasm”
.verilog:
riscv-nuclei-elf-objcopy -O verilog “${BuildArtifactFileBaseName}.elf” “${BuildArtifactFileBaseName}.verilog”
删除工程的Debug目录下所有文件(删除的文件不会放到Windows的垃圾箱)
重新build
build后打开debug目录即可看到我们的.verilog或者.dasm文件
二、如何分析反汇编文件
写了一段非常简单的代码
#include
#include
#include
#include "hbird_sdk_soc.h"
#include
#include
int main(void)
{
matrix_sum_NICE((int)0x800006a4, (int)0x800006b0, (int)0x800006d2);
}
#include
__STATIC_FORCEINLINE void matrix_sum_NICE(int addr_ret, int addr_C, int addr_clipval) {
asm volatile(
".insn r 0x7b, 7, 2, %0, %1, %2"
:"=r"(addr_ret)
:"r"(addr_C),"r"(addr_clipval)
);
}
这是它生成的反汇编代码
我们要先找到main,这是主程序的入口
第一条指令
lui(load upper immediate)是在寄存器左端16位放一个16位数(在指令里面)右端补0
对a5寄存器赋值
第二条指令
将a5的值加1712,成为我们输入的内存地址赋给a4
第三条指令
将a5的值加1746,成为我们输入的内存地址赋给a5
第四条指令
该指令就是我们的自定义指令
可见,这条指令的32位码是02f777fb与书上的编码一致
为:function7 - rs1 - rs2 - function3 - rd - opcode
修改function3为3,发现指令为02f737fb
修改opcode为2,发现指令为04f777fb
修改function7为7f,发现指令为02f777ff
反汇编第一列是命令的存储地址,第二列是存储的值,第三列是翻译的汇编代码
自定义的指令第三列依旧是命令的二进制值