92

我正在努力学习汇编语言。我已经搜索并找到了如何反汇编.c文件,但我认为它会生成一些优化版本的程序。有什么办法可以让我看到与我的 C 文件相对应的确切汇编代码。

4

7 回答 7

125

gcc 选项-O支持不同级别的优化。用于-O0禁用它们并用于-S输出程序集。-O3是最高级别的优化。

从 gcc 4.8 开始,优化级别-Og可用。它启用不干扰调试的优化,并且是标准编辑-编译-调试周期的推荐默认值。

要将程序集的方言更改为 intel 或 att 使用-masm=intelor -masm=att

您还可以使用 手动启用某些优化-fname

查看gcc 手册了解更多信息。

于 2011-04-23T18:01:08.993 回答
12

对于 gcc,您想省略传递给编译器的任何-O1 -O2-O3选项,或者如果您已经拥有它们,您可以附加-O0选项以再次将其关闭。它还可以帮助您添加-g进行调试,以便您可以在调试器中查看 c 源代码和反汇编的机器代码。

另见:http: //sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

于 2011-04-23T18:02:53.013 回答
10

要在没有复制省略的情况下进行测试并查看复制/移动构造函数/操作符的实际作用,请添加“-fno-elide-constructors”。

即使没有优化 (-O0 ),GCC 和 Clang 仍然会进行复制省略,这在某些情况下具有跳过复制/移动构造函数的效果。有关复制省略的详细信息,请参阅此问题

但是,在 Clang 3.4 中它确实触发了一个错误(一个无效的临时对象,没有调用构造函数),该错误在 3.5 中已修复。

于 2014-06-24T10:58:24.680 回答
9

使用命令行选项-O0(-[capital o][zero]) 禁用优化,并-S获取汇编文件。在这里查看更多 gcc 命令行选项。

于 2011-04-23T18:01:56.913 回答
5

您还可以使用 #pragma GCC push_options 在内部控制优化

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options
于 2019-06-25T05:34:44.827 回答
4

很久以前,但仍然需要。

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled
于 2018-12-18T12:04:07.350 回答
3

如果使用 gcc 命令行传递 -O0 ,则可以禁用优化。

例如,将 .C 文件转换为 .S 文件调用:

gcc -O0 -S test.c

于 2011-04-23T18:02:23.120 回答