【问题标题】:Equivalent asm code for C/C++ codes [duplicate]C / C ++代码的等效asm代码[重复]
【发布时间】:2011-03-10 11:33:51
【问题描述】:

可能重复:
How do you get assembler output from C/C++ source in gcc?

大家好!

我有一个 C 和 C++ 源代码,我想在汇编代码中看到它。如何为这些生成等效的 asm 代码?我应该使用什么工具?或者是否已经可以使用诸如 gcc 编译器之类的工具?那我应该执行什么命令呢?我更喜欢 Linux 之上的工具,尤其是 Ubuntu。

提前致谢!

【问题讨论】:

    标签: c++ c assembly ubuntu


    【解决方案1】:

    gcc -S 生成您可能感兴趣的源代码(用于gas 汇编程序)。但请记住,特别是对于 C++,您可能会发现很多有趣的代码确实是链接的标准库、运行时...根据语言而定)。您当然可以反汇编最终代码(例如,只需使用objdump),您可以在其中看到链接器添加的启动代码和其他代码(当然,由于动态绑定,您不会看到代码,例如,C 标准库,因为它不是嵌入式的,除非您使用静态链接创建最终的可执行文件,如果可行,即“静态”版本的库必须存在)

    因此,您获得的不是 C/C++ 源代码的独立等效 asm 代码。这种翻译很难,特别是因为 asm 是一种非常“基本”的语言,因此要能够“1-1”翻译它,您需要大量代码,当然“翻译”将取决于系统(例如,最后的自制输出例程必须使用 OS 提供的 API/系统调用)...基本上您必须在需要时重写 C/C++ 库和运行时(对于 C++)...

    翻译成其他语言,例如从 C++ 到另一种 OO 语言,可能会更简单,但这不是你感兴趣的。

    【讨论】:

      【解决方案2】:

      这里是一个简单的C转asm项目

      http://www.codeproject.com/KB/cpp/KhanC2ASM.aspx

      这是另一个

      http://www.hex-rays.com/idapro/

      你可以通过谷歌搜索找到许多反汇编程序。

      【讨论】:

      • 第一个是编译器,不能完全理解C,也不能完全理解C++,也不能创建最终的二进制文件,所以它产生汇编代码;它会发出 x86 代码吗? (为什么它被标记为交叉编译器?相对于什么交叉?页面不清楚,可能更多在文档中?);第二个是反汇编程序,它不能将 C/C++ 源代码转换为任何东西,但适用于可执行文件(不考虑源代码语言……它可能是 fortran、pascal……随便),但可能是相同的 OP对自己的Q没有一个清晰的想法。
      • @Shin:针对程序集(而不是针对目标代码)的编译器非常很常见。而这里的“cross”是“跨平台”,也就是说,您可以在基于 MIPS 或 PowerPC 的机器上运行程序时准备 x86 代码。
      【解决方案3】:

      我将在已经以一种身份回答这个问题之间采取中间路线(假设您已经安装了gcc ubuntu 软件包,则使用gcc -S)。但是这个问题已经被问到了several times。

      【讨论】:

      • 通常,您在问题的 cmets 中识别重复项,而不是作为答案。
      【解决方案4】:

      对于 gcc,使用 -S 开关。您将获得带有.s 扩展名的文件,您可以在其中看到生成的汇编代码。

      【讨论】:

        【解决方案5】:
        gcc -S x.c
        

        这应该会生成 gcc 认为与您的代码等效的程序集。但请注意,优化器可以做一些非常棘手的事情,这些事情可能很难看到在功能上等同于您的代码。尤其是在 C++ 中,优化器非常依赖内联和类似的东西。

        来自 gcc 手册页:

        -S

        编译阶段后停止 恰当的;不要组装。输出是 以汇编代码文件的形式 对于每个非汇编程序输入文件 指定的。默认情况下,汇编程序 源文件的文件名由 替换后缀 .c、.i 等, 与.s.

        不需要的输入文件 编译被忽略。

        【讨论】:

        • 你不能使用一些选项-O0 可以关闭大多数优化吗?
        • @B Johnson:当然,但即使在 -O0 gcc 也会做一些小事。
        猜你喜欢
        • 2014-03-21
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 2019-07-01
        相关资源
        最近更新 更多