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 标头已包含此信息。
ndisasm
,正如jameslin所建议的那样,也是一个不错的选择,但objdump
通常随操作系统一起提供,并且可以处理 GNU binutils 支持的所有架构(GCC 支持的那些架构的超集),并且它的输出通常可以输入 GNU as
(ndisasm 通常可以nasm
当然,被喂进去)。
Peter Cordes建议“<a href="http://agner.org/optimize/" rel="noreferrer">Agner Fog 的 objconv 非常好。它将标签放在分支目标上,从而更容易弄清楚代码的作用。它可以反汇编成 NASM、YASM、MASM 或 AT&T (GNU) 语法。”</p>
多媒体 Mike已经知道了--adjust-vma
;ndisasm
等效是选项-o
。
例如,要反汇编sh4
代码(我使用 Debian 中的一个二进制文件进行测试),请将其与 GNU binutils 一起使用(几乎所有其他反汇编程序都仅限于一个平台,例如带有ndisasm
and的 x86 objconv
):
objdump -D -b binary -m sh -EL x
The-m
是机器,-EL
意思是 Little Endian(代替sh4eb
使用-EB
),这与存在于任一字节序中的架构相关。