首页 > 其他分享 >ysyx: 指令规则的匹配

ysyx: 指令规则的匹配

时间:2024-07-11 12:18:59浏览次数:4  
标签:匹配 nemu sp ysyx a0 指令 规则 difftest

dummy的反汇编表:

80000000 <_start>:
80000000:       00000413                li      s0,0
80000004:       00009117                auipc   sp,0x9
80000008:       ffc10113                addi    sp,sp,-4 # 80009000 <_end>
8000000c:       00c000ef                jal     ra,80000018 <_trm_init>

80000010 <main>:
80000010:       00000513                li      a0,0
80000014:       00008067                ret

80000018 <_trm_init>:
80000018:       ff010113                addi    sp,sp,-16
8000001c:       00000517                auipc   a0,0x0
80000020:       01c50513                addi    a0,a0,28 # 80000038 <_etext>
80000024:       00112623                sw      ra,12(sp)
80000028:       fe9ff0ef                jal     ra,80000010 <main>
8000002c:       00050513                mv      a0,a0
80000030:       00100073                ebreak
80000034:       0000006f                j       80000034 <_trm_init+0x1c>

  nemu的框架已经提供好了,只需要在inst.c里继续增加指令规则就行。从最简单的dummy开始,nemu报错提示没识别到指令时,就可以仿照已有的例子继续添加了。在这里提供一个方便分析指令的网站:rvcodec.js (luplab.gitlab.io)  反汇编表提供的是已经分析过的汇编代码,并不是这条汇编命令的原貌,所以debug时使用这个网站会更加方便。

  在nemu中,已经写入多条指令规则,但是出问题时难以判断具体问题出在哪条指令上时,可以参考讲义,搭建difftest。具体原理参考讲义。简单地来说,就和PA1里面的expr-gen原理类似。每执行一条指令,就和参考模拟器进行寄存器逐项对比,以此判断自己的代码是否正常运行,也能快速定位出问题的指令。 在补充好difftest的代码后,在nemu文件夹下通过menuconfig启动difftest。

  遇到的一个很吊诡的事,就是在使用difftest之前,我就已经写入了部分规则,通过了部分测试文件的检测,但是启动difftest以后,原本通过的程序反而不通过了。但是在逐条检查代码时,可以发现,原本的指令规则确实是错误的,但是以一种难以理解的方式通过了测试。这些指令一直保留到后期会导致bug更加难以察觉。所以,为了减少这种不必要的麻烦,最好尽快搭建difftest。

  一些需要注意的点:

1. rd需要用宏R()来访问,但是rs1/rs2  (src1\src2)不需要,直接用src1/src2表示的就是寄存器的值。

2. dnpc是会自动增加的,不需要每条规则手动写,但是这并不代表所有指令都不用写,跳转指令是需要提前保存好下一条指令地址的。同时,又由于dnpc会自增,所以在跳转类指令里还需要减去一条指令的地址,也就是-4,是不是很意外?

3.一些指令,比如add和sub,它们的opcode是一样的,但是funct3和funct7不一样,这一点要在规则匹配里体现出来。不能用add尝试顶替sub。

4. 如果指令的规则写对了,但是结果不对,可以试试在规则里插printf,看看立即数对不对。如果立即数不对,那说明imm()函数就已经写错了。

5. 有一条指令比较独特,mulh,它是乘法的升级版,两个数要先变成64位,计算完成后取高32位给rd。问题就在这里:需要留意怎么正确地让rs1 rs2这样的无符号32位变成有符号64位,正确的符号拓展是关键。

6. SEXT是符号拓展的宏,只需要给最高位使用;此外,部分指令的立即数是负载,最低位不使用,所以左移时要注意左移的位数。

标签:匹配,nemu,sp,ysyx,a0,指令,规则,difftest
From: https://www.cnblogs.com/namezhyp/p/18282003

相关文章

  • Linux 基础指令
    来自......
  • C#+OpenCV基础(十八)_模版匹配
    1、MatchTemplate匹配图片///<summary>///匹配图片(Cv2.MatchTemplate)///</summary>///<paramname="matSrc">图片</param>///<paramname="matTo">特征图片</param>///<paramname="outMat">结果图片<......
  • 中移ML307R(4G Cat1,C-SDK,OpenCPU)模组学习开发-AT指令测试
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ML307R_OPEN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>   AT指令手册(串口默认通信波特......
  • 机器学习策略篇:详解数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatc
    详解数据分布不匹配时,偏差与方差的分析估计学习算法的偏差和方差真的可以帮确定接下来应该优先做的方向,但是,当训练集来自和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样,来看为什么。继续用猫分类器为例,说人类在这个任务上能做到几乎完美,所以贝叶斯错误率或者说贝叶......
  • bat常用指令整理
    1.关闭命令行回显功能@echooff一般用在第一行,非常常用2.注释语句双冒号::和rem,放于行首3.提示信息echo"信息"4.设置变量值setxxx_dir="%cd%"setpython="xxx.python.exe"调用变量时需在前面加%%比如%python%xxx.py注意设置环......
  • 卓岚等设备 modbus 指令解释
    寄存器地址DO1:0x0010DI1:0x0000DO2:0x0011DI2:0x0001DO3:0x0012DI3:0x0002DO4:0x0013DI4:0x0003DO5:0x0014DI5:0x0004DO6:0x0015DI6:0x0005DO7:0x0016DI7:0x0006DO8:0x0017DI8:0x0007ModBusRTU写寄存器指令栈地址1byte控制码1byte寄存器地址高位1byte寄存器地址地位1byte写入数据高......
  • uniapp 封装蓝牙-(给设备发指令,分包数据发送)
    注意事项:1、关键点:初始化蓝牙——》uni.openBluetoothAdapter获取本机蓝牙适配器状态——》uni.getBluetoothAdapterState开始搜索蓝牙设备——》uni.startBluetoothDevicesDiscovery监听蓝牙设备(或者蓝牙设备列表,找到需要的那个)——......
  • 08 内核第一条指令
    了解QEMU启动指令qemu-system-riscv64\-machinevirt\-nographic\-bios../bootloader/rustsbi-qemu.bin\-deviceloader,file=target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000-machine virt 表示将模拟的64位RISC-V计算机......
  • 【WCH蓝牙系列芯片】-CH9141模块AT指令增加自定义透传UUID服务
    -------------------------------------------------------------------------------------------------------------------------------------在使用沁恒的蓝牙串口透传芯片CH9141,这是一个自带固件,拿来接上串口就可以直接用的蓝牙模块芯片。支持串口AT配置和在从机模式下......
  • 【算法篇】KMP算法,一种高效的字符串匹配算法
    我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!!KMP算法的基本概念KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。该算法的主要使用场景就是在字符串(也叫主......