我正在使用 GNU arm-none-eabi 工具链为我的 Cortex M3 微控制器开发嵌入式 C 应用程序。
我计划采用供应商在我的 C 应用程序中实现的汇编子例程。我计划创建一个新的 C 函数,然后在其中使用扩展的内联汇编协议编写一个内联汇编块。在这篇文章中,我打算把这个汇编子程序当作一个黑盒子,并打算向这个论坛询问如何构造输入和破坏列表;这个例程没有输出。
汇编子例程期望 r0、r1 和 r2 在调用之前预先设置。此外,该子例程使用寄存器 r4、r5、r6、r7、r8、r9 作为暂存寄存器来执行其功能。它写入设备上的内存范围,由 r0 和 r1 指定,分别是起始地址和停止地址。
所以,我正在检查我的假设是否正确。我的问题如下。
void my_asm_ported_func(int reg_r0, int reg_r1, int reg_r2 {
__asm__ __volatile__ (
"ldr r0, %0 \n\t",
"ldr r1, %1 \n\t",
"ldr r2, %2 \n\t",
"<vendor code...> ",
: /* no outputs */
: "r" (reg_r0), "r" (reg_r1), "r" (reg_r2) /* inputs */
: "r0", "r1", "r2", "r4", "r5", "r6",
"r7", "r8", "r9", "memory" /* clobbers */
);
}
既然这个 asm 子例程写入了设备上的一系列其他内存,那么将“内存”添加到 clobber 列表就足够了吗?似乎太简单了。
是否有更优雅的方式从周围 C 函数中的输入参数输入 r0 - r2?我从 AAPCS 了解到寄存器 r0-r3 是输入参数 1-4,因此像我在输入列表中那样手动输入 r0-r2 似乎是多余的。我是否应该以某种方式将其作为单独的 .S 文件中的纯汇编函数?
提前谢谢你。
我尝试了上面的方法,但使用基本的内联汇编协议,结果很糟糕——它崩溃了。我这样做是因为我认为汇编块自然会通过函数序言获取 r0-r2,它显然这样做是因为它正确地写入了内存,但是一旦我在 asm 块开头的断点被启动(我的vs 代码扩展没有分步反汇编视图,因此它只是将其作为块框运行并崩溃了)。我还没有尝试扩展,我已经做了很多阅读所以我只是想确保我的黑盒方法应该有效并且我没有遗漏任何太大的东西。