Question: Does anyone know how convert C++ code to assembly code and then do the reverse?
The forward way is very easy:

```
g++ -S

```

I want to analyze the output and see if it has been compiled correctly (Just for curiosity now, but it can have some applications). However, my knowledge of assembly is very limited and the output is hard to understand (This is especially true if I use optimizations (-O) or compile with debug info (-g) ).

Is there a de-assembler for C++ (GCC) to produce C++ code? If not, is there any intermediate representation that I can compile C++ code into and then back from it?

There seems to be some ways for converting C++ to C [here](https://stackoverflow.com/questions/5050349/is-there-a-way-to-compile-c-to-c-code). Does GCC have anything for this?

Answer: 
De-compiling assembly language back to C++ is possible (e.g., with [HexRays](http://www.hex-rays.com/products/decompiler/index.shtml)), within some constraints -- primarily that although the C++ you get out will reflect the basic algorithms correctly, it probably won't look much like the original source code (though C++ name mangling does help maintain something closer to the original than you usually get with many other languages).
Perhaps you might be interested in learning more about internal representations used by GCC, in particular [GIMPLE](http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html) (and Tree-s). If you want to take advantage of GCC numerous processing around GIMPLE, you should consider writing a [GCC plugin](http://gcc.gnu.org/onlinedocs/gccint/Plugins.html) or a [GCC MELT extension](http://gcc-melt.org) (MELT is a high-level domain specific language to easily extend GCC).

But all the middle-end internal representations of the C++ compilers I know about are quite far from the C++ source code, because the C++ front-end has already done a lot of work, and there is no easy way to go back to some useful C++.

faithful and complete [decompilation](http://en.wikipedia.org/wiki/Decompiler) is in practice nearly impossible, because the assembly code generated by a compiler has lost some knowledge from the original source code.