簡體   English   中英

使用 gcc 和宏將 ARMv7-M 匯編代碼內聯到 c

[英]inline ARMv7-M assembly code into c using gcc and macros

我有這段代碼可以正常工作:

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。 我實際上有一個宏。

例如:

#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)
    );
}

那不會建立。

在這種情況下如何使用宏?

請參閱下面的編輯。 我只是將第一個解決方案作為您不應該做的事情的示例。


我發現這篇文章給出了我同樣問題的解決方案,但它涉及到 x86。無論如何我都想嘗試一下,而且它有效。

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

#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"
    );
}

編輯

通過查看生成的代碼,我上面建議的解決方案可能不起作用:

  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已發出,但它被代碼包圍,並且沒有指示跳過它。 我相信它可以像指令一樣被嘗試執行。

彼得建議,也許更好的解決方案是

#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"
    );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM