【问题标题】:Dump Assembly of given c++ line(s)转储给定 c++ 行的程序集
【发布时间】:2015-03-09 19:31:27
【问题描述】:

假设我有这样的代码(注意在编辑器中我可以看到行号)

//File example_optimization.cpp

#1 int spreadi = (d_ai - d_bi);
#2 int transactionCosti = spreadi / (spreadi < 10 ? 1 : 10);

如果编译器是优化编译器并且设置了正确的标志,我想向自己证明除以 1 并没有实际发生。

在 linux 中是否有一个工具(或可以通过管道使用的工具组合),我可以这样说:

ctoassembler -c g++ -l 1 2 example_optimization.cpp 

所以这个命令说,调用 ctoassembler 使用编译器和链接器 gnu g++,并转储 c++ 文件 example_optimization.cpp 的第 1 到 2 行。默认是把汇编代码输出到stdout。

我真的不在乎用途是什么。我有兴趣能够看到我的代码被编译器转换成什么,而无需自己搜索。

如果这样更容易,我不介意使用目标文件,但不知何故,最好“并排”显示 c++ 源代码和相应的汇编代码。

【问题讨论】:

    标签: c++ linux assembly disassembly


    【解决方案1】:

    GCC 将停止生成汇编文件:

    -S 在适当的编译阶段后停止;不要组装。输出是每个非汇编程序的汇编程序代码文件的形式 指定的输入文件。默认情况下,源的汇编程序文件名 文件是通过将后缀“.c”、“.i”等替换为“.s”来制作的。

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

    来源:https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#Overall-Options

    您的另一个选择是调试程序并查看汇编程序。

    【讨论】:

      【解决方案2】:

      通过gdb运行代码,在你想要的C行下一个断点,运行,然后输入disassemble查看接下来的几行代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多