I am trying to learn assembly language. I have searched and found how to disassemble a .c
file but I think it produces some optimized version of the program. Is there any way so that I can see the exact assembly code which corresponds to my C file.
-
2the _gcc_ options that control optimizations http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html – abeln Apr 23 '11 at 18:03
-
3The optimized code *is* the exact code that corresponds to your C file. Looking at the disassembly of the un-optimized code creates the wrong impression. It will make you think you can do better. – Hans Passant Apr 23 '11 at 18:42
-
1Like Hans says - the idea of writing in assembly code is to do it better than the compiler. If you look at the optimized code you will see just how hard that is! – Bo Persson Apr 23 '11 at 22:01
-
related: [How to remove "noise" from GCC/clang assembly output?](//stackoverflow.com/q/38552116) – Peter Cordes Feb 04 '19 at 05:30
-
Also related: [Disable all optimization options in GCC](//stackoverflow.com/a/33284629) – Peter Cordes Feb 04 '19 at 05:37
-
3Why do people always jump in with smarty comments without reading the Q properly. it is very obvious the user wants an output as clear as possible in order to help him. Compilers are WAY cleverer than most coders and anyone who thinks that the optimized code is as helpful to a newbie as the unoptimized code is not thinking it out. What he is doing is a very common way of learning assembler and telling gcc NOT to optimize is a thing. – RichieHH Nov 20 '20 at 14:32
7 Answers
The gcc option -O
enables different levels of optimization. Use -O0
to disable them and use -S
to output assembly. -O3
is the highest level of optimization.
Starting with gcc 4.8 the optimization level -Og
is available. It enables optimizations that do not interfere with debugging and is the recommended default for the standard edit-compile-debug cycle.
To change the dialect of the assembly to either intel or att use -masm=intel
or -masm=att
.
You can also enable certain optimizations manually with -fname
.
Have a look at the gcc manual for much more.

- 58,701
- 10
- 113
- 156
-
38And `-O0` is the default (no optimization) if you have not specified any -O flags. – nos Apr 23 '11 at 18:02
-
13With -O0 you still have optimization: Reduce compilation time and make debugging produce the expected results. – klm123 Nov 27 '13 at 17:06
-
@klm123 Right, but it is a close as you can get which is better than nothing. – pmr Nov 27 '13 at 17:11
-
5If you have a reasonably modern gcc that supports -Og, try it I find that it often gives more readable assembly output than -O0. – Viktor Dahl Apr 27 '16 at 07:25
-
To test without copy elision and see you copy/move constructors/operators in action add "-fno-elide-constructors".
Even with no optimizations (-O0 ), GCC and Clang will still do copy elision, which has the effect of skipping copy/move constructors in some cases. See this question for the details about copy elision.
However, in Clang 3.4 it does trigger a bug (an invalid temporary object without calling constructor), which is fixed in 3.5.

- 1
- 1

- 151
- 1
- 2
For gcc you want to omit any -O1 -O2 or -O3 options passed to the compiler or if you already have them you can append the -O0 option to turn it off again. It might also help you to add -g for debug so that you can see the c source and disassembled machine code in your debugger.
See also: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

- 7,145
- 2
- 25
- 28
You can also control optimisations internally with #pragma GCC push_options
#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */
.... code here .....
#pragma GCC pop_options

- 1,545
- 1
- 12
- 19
Long time ago, but still needed.
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

- 28,492
- 4
- 50
- 72

- 41
- 3
You can disable optimizations if you pass -O0 with the gcc command-line.
E.g. to turn a .C file into a .S file call:
gcc -O0 -S test.c

- 83,631
- 31
- 151
- 221