c - 如何从 C 文件中获取完整的汇编代码?

标签 c gcc assembly intel

我目前正在尝试找出从相应的 C 源文件生成等效汇编代码的方法。

我已经使用 C 语言好几年了,但对汇编语言几乎没有经验。

我能够使用 gcc 中的 -S 选项输出汇编代码。然而,生成的汇编代码包含调用指令,这些指令又会跳转到另一个函数,如 _exp。这不是我想要的,我需要在单个文件中提供功能齐全的汇编代码,并且不依赖于其他代码。

是否有可能实现我正在寻找的东西?

为了更好地描述问题,我在这里向您展示我的代码:

#include <math.h>
float sigmoid(float i){
    return 1/(1+exp(-i));
}

我正在使用的平台是 Windows 10 64 位,我使用的编译器是来自 MSbuild 的 cl.exe。

我最初的目标是在尽可能低的层次上了解计算机如何计算数学函数。我决定观察计算过程的层次是汇编代码,我选择的数学函数是上面定义的sigmoid。

最佳答案

_exp是标准数学库函数 double exp(double) ;显然,您所处的平台在 C 符号名称前加上前导下划线。

给定一个 .s调用一些库函数,以与 .c 相同的方式构建它调用库函数的文件:

gcc foo.S -o foo  -lm

默认情况下您将获得一个动态可执行文件。


但如果你真的想要所有代码在一个文件中,没有外部依赖,你可以链接你的.c转换成静态可执行文件并将其反汇编。

gcc -O3 -march=native foo.c -o foo -static -lm
objdump -drwC -Mintel foo > foo.s

不能保证 _explibm.a 中实现(静态库)与您在 libm.so 中获得的相同或 libm.dll或其他,因为它是一个不同的文件。对于像 memcpy 这样的函数尤其如此。其中动态链接器技巧通常用于在运行时选择最佳版本(对于您的 CPU)。

关于c - 如何从 C 文件中获取完整的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50661663/

相关文章:

c - Visual Studio 命令提示符 C/C++ 编译错误 "Error Code C2143: syntax error : missing ' )' before ' ;' "

c - 在c中使用指针相乘矩阵

c - 找到除数并将它们存储在数组中

c++ - 为什么 Clang std::ostream 会写入 std::istream 无法读取的 double 值?

assembly - assembly 新手。如何计算传递的参数中的字符数?

c - 程序C中的意外结果

c - GNU C 预处理器 : Stringify the result of a macro evaluation

c - 使 C 预处理器忽略某些#include 指令

c++ - 未解析的外部符号 C++ 与汇编程序

linux - 使用 NASM 将数字写入文件