【发布时间】:2020-05-07 14:46:32
【问题描述】:
我想在 GCC C 中为 cortex-m0 编写一个例程,其中混合了 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"
);
}
但不幸的是我有问题:
- 我的程序因此而崩溃。
- 编译器声称我的“虚拟”例程没有返回值
编辑,工作代码:我将代码移动到单独的 .s 文件中,最终解决方案如下所示
.syntax unified
.arch armv6-m
.text
.thumb
.thumb_func
.align 1
.globl dummymethod
.type dummymethod, %function
dummymethod:
.fnstart
PUSH {r1-r7, lr}
// here some operation on registers R0..R7
MOV R0, R3 //result is in R0
pop {r1-r7, pc}
.pool
.cantunwind
.fnend
.size dummymethod,.-dummymethod
【问题讨论】:
-
避免内联汇编通常是个好主意。将您的例程放入汇编文件中,然后自行将其汇编为目标文件。
-
对于你应该做的代码应该可以正常工作。它在我的机器上编译得很好。如果有问题,它可能在其他地方。
-
另外,添加
gcc -v的输出。 -
您没有返回值,这就是它抱怨的原因,编译器无法识别包括返回在内的内联汇编功能,因此它看不到返回值(在 C 语言中)。添加任何返回值 return 0;这应该会消失