starblue和hlovdal都有经典答案的一部分。如果你想要反汇编原始的i8086代码,通常需要使用Intel语法而不是AT&T语法,因此请使用:
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
如果你的代码是ELF(或a.out(或(E)COFF)),你可以使用短格式:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
对于32位或64位的代码,可以省略,8086
; ELF头已经包含了这个信息。
正如jameslin所建议的那样,ndisasm
也是一个不错的选择,但是objdump
通常随操作系统一起提供,并且可以处理GNU binutils支持的所有架构(GCC支持的超集),其输出通常可以传递给GNU as
(当然,ndisasm的输出通常可以传递给nasm
)。
Peter Cordes建议“Agner Fog的objconv非常好用。它会在跳转目标上打标签,使得更容易理解代码的作用。它可以反汇编为NASM、YASM、MASM或AT&T(GNU)语法。”
Multimedia Mike已经发现了关于--adjust-vma
的内容;而ndisasm
的等价选项是-o
。
要反汇编例如sh4
代码(我使用Debian中的一个二进制文件进行测试),请使用GNU binutils(其他几乎所有的反汇编器都限于一个平台,例如ndisasm和objconv的x86):
objdump -D -b binary -m sh -EL x
< p > < code > -m 是指机器,而 < code > -EL 表示小端序(如果使用 < code > sh4eb 则应使用 < code > -EB ),这与存在于任一字节顺序的体系结构有关。