首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gcc和宏将ARMv7-M汇编代码内联为c。

使用gcc和宏将ARMv7-M汇编代码内联为c。
EN

Stack Overflow用户
提问于 2022-04-01 09:05:50
回答 1查看 185关注 0票数 1

我有这样的代码可以正常工作:

代码语言:javascript
复制
void function( void )
{
    __asm volatile
    (
        "   ldr r3, .ADDRESS            \n"
        "   mov r2, %0                  \n"
        "   str r2, [r3, %1]            \n"
        ".ADDRESS:  .word 0x401C4000    \n"
        :: "i" (1<<17), "i" (16)
    );
}

但是要声明.ADDRESS,我使用了魔术号0x401C4000。实际上我有一个宏。

例如:

代码语言:javascript
复制
#define ADDR_BASE 0x401C4000
#define ADDR ((void *)ADDR_BASE)

void function( void )
{
    __asm volatile
    (
        "   ldr r3, .ADDRESS            \n"
        "   mov r2, %0                  \n"
        "   str r2, [r3, %1]            \n"
        ".ADDRESS:    .word %2          \n"
        :: "i" (1<<17), "i" (16), "i" (ADDR)
    );
}

那是不可能的。

在这种情况下,如何使用宏?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-01 12:24:02

请参阅下面的编辑。我只是把第一个解决方案作为你不应该做的一个例子。

我找到了这个post,其中给出了解决相同问题的方法,但它涉及到x86。不管怎样,我都想试一试,而且成功了。

然后使用%c2而不是%2,如下所示:

代码语言:javascript
复制
#define ADDR_BASE 0x401C4000
#define ADDR ((void *)0x401C4000)

void function( void )
{
    __asm volatile
    (
        "   ldr r3, .ADDRESS            \n"
        "   mov r2, %0                  \n"
        "   str r2, [r3, %1]            \n"
        ".ADDRESS:   .word %c2          \n"
        :: "i" (1<<17), "i" (16), "i" (ADDR): "r2", "r3", "memory"
    );
}

编辑

通过查看生成的代码,我建议的解决方案可能无法工作:

代码语言:javascript
复制
  20                function:
  21                    @ Function supports interworking.
  22                    @ args = 0, pretend = 0, frame = 0
  23                    @ frame_needed = 1, uses_anonymous_args = 0
  24                    @ link register save eliminated.
  25 0000 04B02DE5      str fp, [sp, #-4]!
  26 0004 00B08DE2      add fp, sp, #0
  27                    .syntax divided
  28                @ 6 "test.c" 1
  29 0008 04309FE5         ldr r3, .ADDRESS            
  30 000c 0228A0E3     mov r2, #131072                  
  31 0010 102083E5     str r2, [r3, #16]            
  32 0014 00401C40  .ADDRESS:   .word 1075593216          
  33                
  34                @ 0 "" 2
  35                    .arm
  36                    .syntax unified
  37 0018 0000A0E1      nop
  38 001c 00D08BE2      add sp, fp, #0
  39                    @ sp needed
  40 0020 04B09DE4      ldr fp, [sp], #4
  41 0024 1EFF2FE1      bx  lr

您可以在第32行看到符号.ADDRESS已经发出,但是它被代码包围,并且没有跳过它的指令。我相信,它可以尝试执行,就像它是一项指示。

也许彼得提出的一个更好的解决方案是

代码语言:javascript
复制
#define ADDR_BASE 0x401C4000
#define ADDR ((void *)0x401C4000)

void function( void )
{
    __asm volatile
    (
    "str %0, [%2, %1]"
    :: "r" (1<<17), "i" (16), "r" (ADDR) : "memory"
    );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71704436

复制
相关文章

相似问题

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