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
);
正在尝试使用内联汇编将变量保存在 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
);