【问题标题】:Calling a function in gcc inline assembly在 gcc 内联汇编中调用函数
【发布时间】:2011-12-20 12:24:34
【问题描述】:

说,我想在 gcc 的内联汇编中调用具有以下签名的函数。我该怎么做?

int some_function( void * arg );

【问题讨论】:

  • 先在 C 基础上做,然后使用 gcc -S 获取模板代码,您可以根据自己的需要进行调整。
  • Paul R,不错的解决方案,但我想要一个更通用的解决方案。
  • 您不应该从内联汇编中调用函数。 GCC 不会尝试解释代码,因此可能会导致错误,例如在没有进行任何函数调用的假设下没有设置堆栈帧。
  • @MetallicPriest:这不是“通用”吗?这是处理几乎所有与装配相关的问题的最快/最简单的方法 - 比从头开始解决所有问题要高效得多。
  • 您为什么要这样做?内联汇编是故意进行的,这样您就不必直接调用汇编函数,并且可以顺利地集成到周围的代码中。您能否更准确地描述一下您的最终目标是什么?

标签: c linux gcc x86 inline-assembly


【解决方案1】:

通常你会想做类似的事情

void *x;
asm(".. code that writes to register %0" : "=r"(x) : ...
int r = some_function(x);
asm(".. code that uses the result..." : ... : "r"(r), ...

也就是说,您根本不想在内联汇编中进行函数调用。这样您就不必担心调用约定的细节或堆栈帧管理。

【讨论】:

  • 内联汇编中要调用函数怎么办?谢谢
  • @cyj:你没有
  • @cyj:Calling printf in extended inline ASM 上有一个答案应该是安全的,并且显示了它有多糟糕。不要这样做。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多