【问题标题】:Convert c calling function in assembly codes to assembly as well将汇编代码中的 c 调用函数也转换为汇编
【发布时间】:2013-08-13 05:58:56
【问题描述】:

我正在处理带有一些数学函数的 C 文件,例如 logexp。我 用 GCC 编译 C 文件以生成汇编代码。在汇编代码中,每当使用pow 函数时,我发现它只会调用C 函数。例如,

    movsd   xmm0, QWORD PTR 16[rbp]   
    call    log  
    addsd   xmm0, xmm0  
    call    exp  
    movsd   QWORD PTR -8[rbp], xmm0

我想知道是否可以告诉 GCC,它不仅会调用 C 函数,还会生成 logexp 的汇编代码?换句话说,是否可以告诉 GCC 生成不需要任何外部函数调用的汇编代码?

谢谢,

【问题讨论】:

  • 你只需要查看 libm 的源代码。
  • 请问您为什么要这样做?即,您只是好奇,还是认为您能够手动优化已编译的程序集?
  • 我们做的一个研究项目,模拟器只需要纯汇编代码,不允许函数调用。

标签: c gcc assembly


【解决方案1】:

您可以在 GDB 或其他调试器中加载您的程序,并在调用上设置断点,然后进入 logexp 函数,在那里,转储它的反汇编(或复制并粘贴它)如果您正在运行适当的调试器)。即使您没有库函数的源代码,您也可以这样做。

【讨论】:

  • 好主意,但这不是便携式的,是吗?
  • 是的,这是个好主意。我使用 Visual Studio 来做这件事,它非常混乱且难以跟踪,但至少它是可行的。
【解决方案2】:

我认为这不能以标准方式完成。但是,您可以自己实现函数(或从现有库中复制代码,例如 Paul R 提到的 libm(libc 的一部分)),然后,重要的是,声明函数 inline强>.

【讨论】:

  • 是的,我查看了 flibm 包,它确实显示了各种数学函数的源代码。
【解决方案3】:

正如其他人所说,您可以从 libm 复制粘贴代码。

尝试使用-finline-functions-finline-limit=n 进行编译 更多信息请见OptimizeOptions

【讨论】:

  • @mathk 是的,我昨晚睡觉前正在考虑这个问题。它必须是静态链接的。
猜你喜欢
  • 2021-04-23
  • 2013-01-22
  • 2014-09-01
  • 2011-09-04
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
相关资源
最近更新 更多