我有一系列最终通过 SVC 调用实现的功能。例如:
void func(int arg) {
asm volatile ("svc #123");
}
正如您可能想象的那样,SVC 对可能在寄存器中的“arg”进行操作。如果我明确地在定义中添加一个“noinline”属性,一切都会如你所愿。
但是,如果函数在更高的优化级别内联,将“arg”加载到寄存器中的代码将被省略——因为显然没有对“arg”的引用。
我尝试在 'arg' 本身的声明中添加一个 'used' 属性——但 gcc 在这种情况下显然会产生警告。
我还尝试添加“虚拟”asm 语句,例如
asm ("" : "=r"(arg));
但这似乎并不普遍。(也许我也需要在这里说 volatile ???)
无论如何,对于一个其主体基本上由一个 asm 语句组成的例程有一个显式的函数调用似乎是不幸的。