84
votes

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.

7
the gcc options that control optimizations gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html - abeln
The 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
Like 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
Why 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

7 Answers

120
votes

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.

12
votes

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

10
votes

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.

8
votes

Use the command-line option -O0 (-[capital o][zero]) to disable optimization, and -S to get assembly file. Look here to see more gcc command-line options.

4
votes

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
4
votes

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
3
votes

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