我想在GCC C中为cortex-m4编写一个例程,其中将C和汇编代码混合在一起。我正在尝试类似的东西
__attribute__((naked)) uint8_t dummy(uint8_t value)
{
asm volatile (
"push {r1-r7, lr}\n\t"
// R0 contains input value
//here i do some operation on registers r0..r7
//.....
//I guess result will be in the R0 register
"MOV R0, R3\n\t"
"pop {r1-r7, pc}\n\t"
);
}
但是不幸的是我有问题:
使用真实汇编
.cpu cortex-m4
.thumb
.globl dummy
.thumb_func
dummy:
mov r0,r3
bx lr
调用约定允许修改r0-r3,返回r0,您无需触摸r4,r5,r6,r7,lr,因此无需推动它们。
丑陋,但您可以使用首选gcc,gnu汇编程序进行汇编(arm-whatever-as)
如果以汇编语言编写函数体,则应考虑以汇编语言编写整个函数。查看[这里] [1]:
但是它就是它。因此,编译器说没有返回值,因为没有返回值。您避免使用return语句。 return语句不仅仅将值放入正确的寄存器中。它还会删除本地堆栈框架并重置堆栈和框架指针PC ...
如果您要返回某些内容,我建议按照[此处] [2]所述使用内联汇编。
int do(){
int input = 0;
int output = 0;
asm volatile ("push {r1-r7, lr}\n\t"
"mov %1, r1;"
"mov r1, %0;"
"pop {r1-r7, lr}\n\t"
:"=r"(output) // = %0
:"r"(input) // = %1
:);
return output;
}´
enter code here
[1]: https://stackoverflow.com/questions/8054362/mixing-c-and-assembly-files
[2]: https://stackoverflow.com/questions/14628885/manipulating-c-variable-via-inline-assembly