RISC-V MCU中文社区

【分享】 C内联汇编nice指令解读

发表于 全国大学生集成电路创新创业大赛 2021-04-22 20:46:39
4
4570
3

RVMCU课堂「8」: 手把手教你玩转RVSTAR—内联汇编篇

一、指令基本结构

支持类型:只支持R型

Nameopcodetype
CUSTOM07'h0bR type
CUSTOM17'h2bR tpye
CUSTOM27'h5bR type
CUSTOM37'h7bR 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

二、示例分析


1.custom_lbuf

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

  • 字母“r”表示使用编译器自动分配的寄存器来存储该操作数变量;字母“m” 表示使用内存地址来存储该操作数变量。如果同时指明“rm”,则编译器自动选择最优方案。。
  • 对于“输出操作数”而言,等号“=”代表输出变量用作输出,原来的值会被新值替换;“+”代表输出变量不仅作为输出,而且作为输入。

opcodefunc3func7rdrs1rs2
0x7b21x0%1x0
custom3只读取rs1的数据第一种操作零寄存器保存addr地址零寄存器
11110110100000001000000101000000


机器码:

funct7rs2rs1funct3rdopcode
00000010000001010010000001111011

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

2.custom_sbuf

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

opcodefunc3func7rdrs1rs2
0x7b22x0%1x0
custom3只读取rs1的数据第二种操作零寄存器保存addr地址零寄存器
11110110100000010000000101000000

机器码:

funct7rs2rs1funct3rdopcode
00000100000001010010000001111011

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

3.custom_rowsum

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

opcodefunc3func7rdrs1rs2
0x7b66%0%1x0
custom3读取rs1、rd的数据第六种操作rowsum地址保存addr地址零寄存器
11110111100000110010110101000000

机器码:

funct7rs2rs1funct3rdopcode
00001100000001010110010111111011

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

riscv 寄存器编号:



喜欢3
用户评论 (4)
何志帆

何志帆 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板