arm 内联汇编 - 将 C 变量存储在 arm 寄存器中

arm inline assembly - store C variable in arm register

正在尝试使用内联汇编将变量保存在 arm 寄存器中。

    unsigned int lma_offset = 0x1234; // typically calculated, hardcoded for example

    __asm volatile ("MOV R10, %[input]"
        : [input] "=r" (lma_offset)
      );

在我的例子中, lma_offset更改为 0xd100,而不是设置寄存器。我做错了什么?

PS:当我将 lma_offset 声明为 const 时,它给出了编译器错误,因为 lma_offset 被用作输出。很明显出了点问题,我仍然找不到正确的语法。

根据 Erics 的评论供将来参考

const unsigned int lma_offset = 0x10000;

__asm__ volatile ("MOV R10, %[input]"
    : // no C variable outputs
    : [input] "r" (lma_offset)
    : "R10"      // tell the compiler R10 is modified
      );

使用双 : 并将“=r”替换为“r”确实解决了问题。

也可以通过使用寄存器局部变量强制 "r" 输入选择 r10 来要求编译器在 R10 中为 asm 语句提供该常量。 (那我们可以省略多余的mov r10, r10)。

 register unsigned r10 __asm__("r10") = lma_offset;  // picks r10 for "r" constraints, no other *guaranteed* effects
 __asm__ volatile ("@ inline asm went here"  // empty template, actually just a comment you can see if looking at the compiler's asm output
   : // no C variable outputs
   : [input] "r" (lma_offset)
   : // no clobbers needed
 );

将寄存器写入某个输出 C 变量时,会导致

unsigned int lma_offset = 0x0;

__asm__ volatile ("MOV %[output], R11"
    : [output] "=r" (lma_offset)
    // no clobbers needed; reading a register doesn't step on the compiler's toes
      );