如何使用 C 表达式操作数将函数地址传递给汇编器指令

How to pass function address to Assembler Instructions with C Expression Operands

gcc/clang 对于 ARM cortex M,有没有办法在带有 C 表达式操作数的汇编程序指令中将函数地址作为常量传递?更准确地说,我想用函数地址(存储在内存中)加载 R12: ldr R12, =func 在 C 函数中,像这样的例子

// __attribute__((naked)) 
int loader(int fn)
{
__asm ("ldr R12, =%0"::??? (fn):"r12");
// ... then  SVC #0, and the R0 is the return value 
}

问题是我必须为输入操作数输入什么?

编辑: 感谢您的意见! 实际上我需要重新实现 KEIL 的 __svc_indirect(0),它用函数地址加载 R12 并在 R0..R3 中传递最多四个参数(参见 __svc_indirect

使用 i 约束并手动添加 = 字符:

__asm ("ldr r12, =%0" :: "i"(fn) : "r12");

请注意,由于其他原因,内联汇编语句仍然不正确,其中一些原因已在您的问题的评论中进行了概述。还可以考虑对这类事情使用寄存器约束变量:

register int fn asm("r12");
__asm ("" :: "r"(fn));