编程环境是:stm32cubeIde
原因:很多操作需要使用底层来做,比如中断时的上下文数据保存。也就是说用到汇编来实现。
疑问:c语言怎么才能跟汇编很好的兼容在一起呢?必将是我下一步的必经探索之路了。
一、C语言和汇编兼容格式
asm( 汇编字符串 : 输出约束字符串 : 输入约束字符串 : 可能被使用了的寄存器 );
汇编字符串:
"mov %[c] , r0 " "mov r0,r1" "add %[c] , %[a], %[b] "
输出约束操作(可以类比函数的返回值):
c\] "r"(c)
输入约束操作 (可以类比函数的参数):
\[a\] "r"(a), \[b\] "r"(b)
可能被使用了的寄存器 (有的地方叫被破坏了的寄存器):
"r0" "r1"
### 二、解释一下约束符
* 汇编代码字符串:包含ARM汇编指令的字符串。我们可以在该字符串中使用`%[name]`的形式来引用C语言变量。
* 输入约束:用于将C语言变量映射到ARM寄存器。输入约束的形式为`"约束代码"(变量名)`。例如,`"r"(a)`表示将变量`a`映射到一个通用寄存器。
* 输出约束:用于将ARM寄存器的值映射回C语言变量。输出约束的形式为`"=约束代码"(变量名)`。例如,`"=r"(c)`表示将一个通用寄存器的值赋给变量 `c.`
* Clobber列表:用于列出内联汇编代码可能修改的寄存器。这有助于编译器在生成代码时正确处理这些寄存器。Clobber列表的形式为`"寄存器名"`,多个寄存器名用逗号分隔。例如,`"r0", "r1", "cc"`表示内联汇编代码可能会修改`r0`、`r1`寄存器和条件码寄存器。
### 三、操作数约束符
* `"r"`:表示通用寄存器。例如,`"r"(a)`表示将变量`a`映射到一个通用寄存器。
* `"l"`:表示一个立即数。例如,`"l"(a)`表示将变量`a`视为一个立即数。
* `"m"`:表示一个内存操作数。例如,`"m"(a)`表示将变量`a`视为一个内存操作数。
### 四、寄存器约束符
寄存器约束用于指定内联汇编代码中使用的具体寄存器。寄存器约束的形式为`"约束代码(寄存器名)"`。例如,`"r"(r0)`表示将变量映射到`r0`寄存器。
### 五、案例
##### 1、加法
#include \