如何使用 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));
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));