首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联ASM -使用16或32位C变量(GCC手臂,拇指模式)

内联ASM -使用16或32位C变量(GCC手臂,拇指模式)
EN

Stack Overflow用户
提问于 2016-05-22 23:27:39
回答 1查看 714关注 0票数 0

我目前正在使用以下内联ASM为Cortex-M3分支到特定的闪存地址。

代码语言:javascript
复制
__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 execution
  • 但是,我希望将硬编码值0x8014替换为一个C变量,该变量将根据其他一些条件进行计算。
  • 这个变量的最大可能值是0x20000,所以我计划使用一个uint32_t来存储它。
  • 正在使用的编译器是arm-none-eabi-gcc v4.9.3

我试图按照以下方式修改我的内联ASM:

代码语言:javascript
复制
uint32_t destination_address = 0x8000;
__asm( "LDR R0, =%[dest]" : : [dest]"r"(destination_address) );

但是,这会生成编译器错误:

代码语言:javascript
复制
undefined reference to `r3'

我是相当新的内联ASM在一般。我试着研究这个问题已经有两天了,但是由于编译器的多样性以及我对Cortex-M3使用拇指指令的事实,我被相互矛盾的答案弄糊涂了。

我认为我的问题是需要为变量destination_address (范围为0x0-0x20000)找到正确的约束,但我不确定。

EN

回答 1

Stack Overflow用户

发布于 2016-05-24 19:22:23

为什么要使用内联程序集?

代码语言:javascript
复制
extern void HOP ( unsigned int );
...
unsigned int some_address;
..
some_address = some_math;
HOP(some_address);

和几行真正的asm,如果你真的觉得必须从一个对象到链接,你可以使用c编译器。

代码语言:javascript
复制
.globl HOP
HOP:
   bx r0

附加的好处是它基本上是一个分支链接,如果你想要的话。

编译器已经计算出了它听起来像的地址,所以您“只是”需要将它放到寄存器中,并将其用于bx。内联程序集是非常特定于编译器的,因此您需要首先讨论正在使用的汇编程序、版本等。

你能做的另一件事是如果你有这个

代码语言:javascript
复制
unsigned int some_address;
..
some_address = some_math;

您可以在项目的某个地方使用此程序集。

代码语言:javascript
复制
ldr r0,=some_address;
ldr r0,[r0]
bx r0

链接器将解析到C变量的地址。因此,可以使用真正的汇编程序或内联类似的东西。(如果内联不支持类似mov %0、some_address、bx %0之类的内容,并为您完成这项工作)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37380674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档