riscv实现自定义指令并用qemu运行 | 您所在的位置:网站首页 › qemu仿真riscv指令集 › riscv实现自定义指令并用qemu运行 |
目的: 实现cube指令,传入一个数,比如2,那么该指令返回的结果是8,如果是3,则返回3^3=27。 riscv指令的类型: 对于riscv,其指令按照特定的类型分为一下几种。 目前的实现只基于R-type。 其扩展指令集的格式如下 .insn r opcode, func3, func7, rd, rs1, rs2按照其语法规则opcode表示操作码,目前是7位,对于非压缩指令来说,最后两位是0。所以自己可以定义一个操作码,当然有一下操作码已经使用了,具体可以查看下面的仓库。 https://github.com/riscv/riscv-opcodes也可以在riscv官网上 https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf的第Chapter 24 RV32/64G Instryction Set Listings查看目前riscv定义的指令码。 比如关于算数的指令集定义如下: 自己设计一条指令要在这些标准指令之外的,比如操作码为0x7b。 内联汇编格式如下: asm volatile(".insn r 0x7b, 6, 6, %0, %1, x0" : "=r"(cube) : "r"(addr));于是,按照语法解析如下: * func7 rs2 rs1 func3 rd opcode * 31---------25--------19------15------12----------------6----------0 * | 000110 | 00000 | ***** | 110 | ***** | 1111011 | * |------------------------------------------------------|----------|上图中,*表示的是任意值,所以该指令在翻译的时候,实际上就是取出rs1表示的是寄存器地址,然后返回的是rd,也是寄存器地址。最后,从寄存器中存放的地址取数据则得到相应的值。 |
CopyRight 2018-2019 实验室设备网 版权所有 |