我正在努力学习汇编语言。我已经搜索并找到了如何反汇编.c
文件,但我认为它会生成一些优化版本的程序。有什么办法可以让我看到与我的 C 文件相对应的确切汇编代码。
7 回答
gcc 选项-O
支持不同级别的优化。用于-O0
禁用它们并用于-S
输出程序集。-O3
是最高级别的优化。
从 gcc 4.8 开始,优化级别-Og
可用。它启用不干扰调试的优化,并且是标准编辑-编译-调试周期的推荐默认值。
要将程序集的方言更改为 intel 或 att 使用-masm=intel
or -masm=att
。
您还可以使用 手动启用某些优化-fname
。
查看gcc 手册了解更多信息。
对于 gcc,您想省略传递给编译器的任何-O1 -O2或-O3选项,或者如果您已经拥有它们,您可以附加-O0选项以再次将其关闭。它还可以帮助您添加-g进行调试,以便您可以在调试器中查看 c 源代码和反汇编的机器代码。
另见:http: //sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
要在没有复制省略的情况下进行测试并查看复制/移动构造函数/操作符的实际作用,请添加“-fno-elide-constructors”。
即使没有优化 (-O0 ),GCC 和 Clang 仍然会进行复制省略,这在某些情况下具有跳过复制/移动构造函数的效果。有关复制省略的详细信息,请参阅此问题。
但是,在 Clang 3.4 中它确实触发了一个错误(一个无效的临时对象,没有调用构造函数),该错误在 3.5 中已修复。
使用命令行选项-O0
(-[capital o][zero]) 禁用优化,并-S
获取汇编文件。在这里查看更多 gcc 命令行选项。
您还可以使用 #pragma GCC push_options 在内部控制优化
#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */
.... code here .....
#pragma GCC pop_options
很久以前,但仍然需要。
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
如果使用 gcc 命令行传递 -O0 ,则可以禁用优化。
例如,将 .C 文件转换为 .S 文件调用:
gcc -O0 -S test.c