A disassembler is a computer program which translates machine language into assembly language, performing the inverse operation to that of an Assembler. A dissasembler differs from a Decompiler, which targets a high level language rather than assembly language. Disassembly, the output of a disassembler, is often formatted for human-readability rather than suitability for input to an assembler, making it principly a reverse engineering tool.
Assembly language source code generally permits the use of Variable#Constants and programmer Comments. These are usually removed from the final machine code by the assembler. If so, a disassembler operating on the machine code would produce disassembly lacking these constants and comments; the dissassembled output becomes more difficult for a human to interpret than the original annotated source code. Some disassemblers can infer useful names and comments; however, interactive disassemblers are able to successfully disassemble more programs than fully-automated disassemblers because human insight applied to the disassembly process parallels human creativity in the code writing process.
There can never be a completely automated disassembly tool which always outputs correct source code because the disassembly process Reduction (complexity) to the impossible-to-solve halting problem.
=Disassemblers=
Most Debuggers include a disassembler, e.g. objdump, part of GNU Binutils.
RosASM - 32 bit Assembler (The Bottom Up Assembler which is free and GPLed). Although this tool is basically an Assembler, it also contains a very powerful (though automated) disassembler that is able to rebuild a huge variety of small applications. Support for disassembly of larger applications is under development.
Interactive Disassembler - A commercial, interactive disassembler.
[http://www.v-com.com/product/Sourcer_Products_Home.html Sourcer] - A disassembler based on definition files.
[http://bastard.sourceforge.net The Bastard Disassembler] - Linux disassembler. Doesn t have a usable front-end yet, but it does have an interactive command-line mode.
[http://bastard.sourceforge.net/libdisasm.html x86 Disassembler Library] - The library that Bastard is based on.
[http://www.dms.at/kopi/ Kopi Project]
[http://pvdasm.reverse-engineering.net/ PVDasm] - Proview (a.k.a: PVDasm) is: Interactive, Multi-Cpu (x86/Chip8) Disassembler.
[http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/javap.html The Java Class File Disassembler]
[http://hte.sourceforge.net HT Editor] - Binary editor for Linux and Windows console.
=References=
L. Vinciguerra, L. Wills, N. Kejriwal, P. Martino, and R. Vinciguerra, An Experimentation Framework for Evaluating Disassembly and Decompilation Tools for C++ and Java , Proc. of 10th Working Conference on Reverse Engineering (WCRE) 2003.
B. Schwarz, S. Debray, and G. Andrews, Disassembly of Executable Code Revisited , Proc. of 9th Working Conference on Reverse Engineering (WCRE) , pp. 45-54, 2002.
=External links=
[http://www.program-transformation.org/Transform/DisAssembly transformation Wiki on disassembly]
[http://www.kip.uni-heidelberg.de/atlas/DATA/hdmc/source/class_disassembler.html Disassembler Class Reference]
[http://citeseer.ist.psu.edu/cisq=disassembler Citations from CiteSeer]