编程语言
首页 > 编程语言> > c – 使用GCC的内联汇编进行直接C函数调用

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