[starblue](
[To see links please register here]
) and [hlovdal](
[To see links please register here]
) both have parts of the canonical answer. If you want to disassemble raw i8086 code, you usually want Intel syntax, not AT&T syntax, too, so use:
objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin # for 64-bit code
If your code is ELF (or a.out (or (E)COFF)), you can use the short form:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
For 32-bit or 64-bit code, omit the `,8086`; the ELF header already includes this information.
`ndisasm`, as suggested by [jameslin](
[To see links please register here]
), is also a good choice, but `objdump` usually comes with the OS and can deal with all architectures supported by GNU binutils (superset of those supported by GCC), and its output can usually be fed into GNU `as` (ndisasm’s can usually be fed into `nasm` though, of course).
[Peter Cordes](
[To see links please register here]
) suggests that “[Agner Fog's objconv](
[To see links please register here]
) is very nice. It puts labels on branch targets, making a lot easier to figure out what the code does. It can disassemble into NASM, YASM, MASM, or AT&T (GNU) syntax.”
[Multimedia Mike](
[To see links please register here]
) already found out about `--adjust-vma`; the `ndisasm` equivalent is the `-o` option.
To disassemble, say, `sh4` code (I used one binary from Debian to test), use this with GNU binutils (almost all other disassemblers are limited to one platform, such as x86 with `ndisasm` and `objconv`):
objdump -D -b binary -m sh -EL x
The `-m` is the machine, and `-EL` means Little Endian (for `sh4eb` use `-EB` instead), which is relevant for architectures that exist in either endianness.