c – 使用GCC的内联汇编进行直接C函数调用
作者:互联网
如果要从内联汇编调用C/C++函数,可以执行以下操作:
void callee() {}
void caller()
{
asm("call *%0" : : "r"(callee));
}
然后GCC将发出如下所示的代码:
movl $callee, %eax
call *%eax
这可能会有问题,因为间接调用会破坏旧CPU上的管道.
由于被调用者的地址最终是常量,因此可以想象可以使用i约束.引自GCC在线docs:
`i’
An immediate integer operand (one with constant value) is allowed. This
includes symbolic constants whose
values will be known only at assembly
time or later.
如果我尝试这样使用它:
asm("call %0" : : "i"(callee));
我从汇编程序中收到以下错误:
Error: suffix or operands invalid for `call’
这是因为GCC会发出代码
call $callee
代替
call callee
所以我的问题是是否可以使GCC输出正确的调用.
解决方法:
我从GCC的邮件列表中得到了answer:
asm("call %P0" : : "i"(callee));
现在我只需要找出%P0实际意味着什么,因为它似乎是一个没有文档的功能……
编辑:在查看GCC源代码之后,并不完全清楚约束前面的代码P是什么意思.但是,除其他外,它阻止GCC在常数值前加上$.这正是我在这种情况下所需要的.
标签:c-3,c,gcc,inline-assembly,function-call 来源: https://codeday.me/bug/20190928/1829144.html