第一步:利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言
第二步:利用RSIC-V的中的.insn模板进行自定义指令的插入
第三步:RISC-V开发环境的搭建
C语言插入汇编
GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了程序设计。使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC对这些操作有哪些限制条件。
void test(void)
{
input= 1;
__asm__ __volatile__
(
"movl %1,%0" :
"=r" (result) :
"r" (input)
);
return 1;
}
对应的汇编代码如下;
行号 代码 解释
1
7
8 movl $1, input 对应C语言语句input = 1;
9 movl input, %eax 隐式处理
10 #APP GCC插入的注释,表示内嵌汇编开始
11 movl %eax,%eax 我们的内嵌汇编语句
12 #NO_APP GCC 插入的注释,表示内嵌汇编结束
13 movl %eax, result 将结果存入result变量,隐式处理
“movl %1,%0”是指令模板;“%0”和“%1”代表指令的操作数,称为占位符,内嵌汇编靠它们将C语言表达式与指令操作数相对应。“result”和“input”为C语言中的两个变量名。其中result对应着%0,input对应着%1。即movl input result。
在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求。“result”前面的限制字符串是“=r”,其中“=”表示“result”是输出操作数,“r”表示需要将“result”与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是“result”本身,当然指令执行完后需要将寄存器中的值存入变量“result”,从表面上看好像是指令直接对“result”进行操作,实际上GCC做了隐式处理,这样我们可以少写一些指令。“input”前面的“r”表示该表达式需要先放入某个寄存器,然后在指令中使用该寄存器参加运算。
RSIC-V支持自定义指令
核心思想:利用Kito Cheng提供的.insn模板进行开发
第一步:确定opcode RV32指令架构中定义了4种custom指令类型,opcode需使用表格custom-0/custom-1/custom-2/custom-3中的一种:

最低0.47元/天 解锁文章
32

被折叠的 条评论
为什么被折叠?



