RISC-V MCU中文社区

【分享】 在C/C++程序中嵌入汇编

发表于 全国大学生集成电路创新创业大赛 2021-06-09 09:12:30
0
1516
2

一.队伍介绍

队伍编号:CICC1915   

本文介绍的是RISC-V的工具链GCC内联汇编。

二.具体实现方法和步骤

在RISC-V架构中定义的CSR寄存器需要使用特殊的CSR指令进行访问,如果C、C++程序中需要访问CSR寄存器,只能使用内嵌汇编指令的方法。在C、C++程序中嵌入汇编程序遵循GCC内联汇编语法规则如下:

asm   volatile(

汇编指令列表

  :输出操作数

  :输入操作数

  :可能影响的寄存器或存储器);

以下分别详细介绍:

1.关键词“asm”是GCC的关键词,表示进行内联汇编操作。这里我们可以用前后各带下划线的关键词asm。

2.关键词“volatile”是可选的。如果在使用的过程中添加此关键词,则要求编译器对后续括号内添加的汇编程序不进行任何优化以保持其原状;如果没有添加此关键词,则编译器可能会将某些汇编指令优化掉。

3.“汇编指令列表”,就是需要嵌入的汇编指令。每条指令需要被双引号括起来,两条指令之间必须以"n"或者";"作为分隔符,没有添加分隔符的两个字符串会被合并成为一个字符串。“汇编指令列表”的编写语法和普通的汇编程编写是一样的。

4."输入操作数",用来指定当前内联汇编程序的输入操作符列表。

5.“可能影响的寄存器或存储器”用来告诉编译器当前内联汇编语句可能会对某些寄存器或存储器的内容修改,使编译器优化的时候考虑进去。

下面列举一个完整的内联汇编程序:

asm   volatile(

     “Instruction_1n"

       "Instruction_2n"

       "Instruction_3n"

        :[out1]"=r"(value1),   [out2]"=r"(valuee2),  [out3]"=r"(value3)

        :[in1]"r"(value1),     [in2]"r"(value2),   [in3]"r"(value3)  

        :"r0",  "r1", "r2"

);

三.总结

汇编语言抽象层次低,但程序编写难度大。我们在实际工程编写中可以去阅读完整的GNU汇编语法手册,里面有语法介绍可以进行学习与借鉴。

喜欢2
用户评论
卡比巴拉的海

卡比巴拉的海 实名认证

懒的都不写签名

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