如果你想从内嵌汇编中调用一个C/C++函数,可以这样做:
void callee() {}
void caller()
{
asm("call *%0" : : "r"(callee));
}
接下来,GCC将会生成类似这样的代码:
movl $callee, %eax
call *%eax
这可能会有问题,因为对于旧的CPU来说,间接调用会破坏流水线。
由于的地址最终是一个常量,我们可以想象可以使用约束。引用自GCC在线文档:
`i'
允许立即整数操作数(具有固定值)。这包括在汇编时或之后才会知道其值的符号常量。
如果我尝试像这样使用它:
asm("call %0" : : "i"(callee));
我从汇编器中得到以下错误:
错误:对于 `call',后缀或操作数无效
这是因为GCC生成的代码如下:
call $callee
与其使用
call callee
我的问题是是否有可能使GCC输出正确的call
指令。
__attribute__((used))
,这样它就不会被优化掉。 如果您只有一个目标操作系统和CPU架构,则无需担心可移植性。 顺便问一下,您真的在内核代码中使用C++吗? - R.. GitHub STOP HELPING ICE