如果要从内联汇编中调用 C/C++ 函数,可以执行以下操作:
void callee() {}
void caller()
{
asm("call *%0" : : "r"(callee));
}
然后 GCC 将发出如下代码:
movl $callee, %eax
call *%eax
这可能会产生问题,因为间接调用会破坏旧 CPU 上的管道。
由于地址callee
最终是一个常数,可以想象使用i
约束是可能的。引用 GCC 在线文档:
‘我’
允许使用立即整数操作数(具有常数值的操作数)。这包括符号常量,其值仅在汇编时或以后才知道。
如果我尝试像这样使用它:
asm("call %0" : : "i"(callee));
我从汇编程序中收到以下错误:
错误:“调用”的后缀或操作数无效
这是因为 GCC 发出代码
call $callee
代替
call callee
所以我的问题是是否可以让 GCC 输出正确的call
.