我目前正在使用以下内联ASM为Cortex-M3分支到特定的闪存地址。
__asm("LDR R0, =0x8000"); // Load the branch address
__asm("LDR R1, [R0]"); // Get the branch address
__asm("ORR R1, #1"); // Make sure the Thumb State bit is set.
__asm("BX R1"); // Branch execution0x8014替换为一个C变量,该变量将根据其他一些条件进行计算。uint32_t来存储它。arm-none-eabi-gcc v4.9.3我试图按照以下方式修改我的内联ASM:
uint32_t destination_address = 0x8000;
__asm( "LDR R0, =%[dest]" : : [dest]"r"(destination_address) );但是,这会生成编译器错误:
undefined reference to `r3'我是相当新的内联ASM在一般。我试着研究这个问题已经有两天了,但是由于编译器的多样性以及我对Cortex-M3使用拇指指令的事实,我被相互矛盾的答案弄糊涂了。
我认为我的问题是需要为变量destination_address (范围为0x0-0x20000)找到正确的约束,但我不确定。
发布于 2016-05-24 19:22:23
为什么要使用内联程序集?
extern void HOP ( unsigned int );
...
unsigned int some_address;
..
some_address = some_math;
HOP(some_address);和几行真正的asm,如果你真的觉得必须从一个对象到链接,你可以使用c编译器。
.globl HOP
HOP:
bx r0附加的好处是它基本上是一个分支链接,如果你想要的话。
编译器已经计算出了它听起来像的地址,所以您“只是”需要将它放到寄存器中,并将其用于bx。内联程序集是非常特定于编译器的,因此您需要首先讨论正在使用的汇编程序、版本等。
你能做的另一件事是如果你有这个
unsigned int some_address;
..
some_address = some_math;您可以在项目的某个地方使用此程序集。
ldr r0,=some_address;
ldr r0,[r0]
bx r0链接器将解析到C变量的地址。因此,可以使用真正的汇编程序或内联类似的东西。(如果内联不支持类似mov %0、some_address、bx %0之类的内容,并为您完成这项工作)
https://stackoverflow.com/questions/37380674
复制相似问题