RVMCU课堂「8」: 手把手教你玩转RVSTAR—内联汇编篇 技术分享--利用 NucleiStudio IDE 和 vivado 进行软硬件联合仿真

一、基本结构

支持类型:只支持R型

Name opcode type
CUSTOM0 7'h0b R type
CUSTOM1 7'h2b R tpye
CUSTOM2 7'h5b R type
CUSTOM3 7'h7b R type

1.costom3 lbuf(a1): 加载内存中的数据至row_buf :

.insn r opcode,func3,func7,rd,rs1,rs2

2.costom3 sbuf(a1): 保存数据row_buf的数据至内存:

.insn r opcode,func3,func7,rd,rs1,rs2

3.costom3 acc rowsum: 加载a1地址的数据,累加row 数据并写回:

rowsum rd,a1,x0

.insn r opcode,func3,func7,rd,rs1,rs2

image.png

二、示例分析

1.custom_lbuf

".insn r 0x7b, 2, 1, x0, %1, x0" :"=r"(zero) :"r"(addr)

  • 字母“r”表示使用编译器自动分配的寄存器来存储该操作数变量;字母“m” 表示使用内存地址来存储该操作数变量。如果同时指明“rm”,则编译器自动选择最优方案。。
  • 对于“输出操作数”而言,等号“=”代表输出变量用作输出,原来的值会被新值替换;“+”代表输出变量不仅作为输出,而且作为输入。
opcode func3 func7 rd rs1 rs2
0x7b 2 1 x0 %1 x0
custom3 只读取rs1的数据 第一种操作 零寄存器 保存addr地址 零寄存器
1111011 010 0000001 00000 01010 00000

机器码:

funct7 rs2 rs1 funct3 rd opcode
0000001 00000 01010 010 00000 1111011
把addr的地址加载到源寄存器1,编译器会自动分配rs1用哪一个寄存器(这里是x10),执行lbuf操作,将数据导入nice_core。

2.custom_sbuf

".insn r 0x7b, 2, 2, x0, %1, x0" :"=r"(zero) :"r"(addr)

opcode func3 func7 rd rs1 rs2
0x7b 2 2 x0 %1 x0
custom3 只读取rs1的数据 第二种操作 零寄存器 保存addr地址 零寄存器
1111011 010 0000010 00000 01010 00000

机器码:

funct7 rs2 rs1 funct3 rd opcode
0000010 00000 01010 010 00000 1111011
把addr的地址加载到源寄存器1,编译器会自动分配rs1用哪一个寄存器(这里是x10),执行sbuf操作,将nice_core的数据导出addr。

###3.custom_rowsum

".insn r 0x7b, 6, 6, %0, %1, x0" :"=r"(rowsum) :"r"(addr)

opcode func3 func7 rd rs1 rs2
0x7b 6 6 %0 %1 x0
custom3 读取rs1、rd的数据 第六种操作 rowsum地址 保存addr地址 零寄存器
1111011 110 0000110 01011 01010 00000

机器码:

funct7 rs2 rs1 funct3 rd opcode
0000110 00000 01010 110 01011 1111011
把addr、rd的地址加载到读源寄存器1、写目标寄存器rd,编译器会自动分配rs1,rd用哪一个寄存器(这里是x10、x11)。执行sumrow操作。

riscv 寄存器编号:

image.png

标签: riscv, 内联汇编

添加新评论