如何查看 C + + 程序的汇编代码?
有什么流行的工具可以做到这一点?
无论使用什么调试器,都应该有一个汇编视图(VisualStudio、 BorlandIDE、 gdb 等)。如果您不使用调试器,而只是想查看程序中的程序集,那么您可以使用反汇编程序,或者可以选择运行程序并用调试器附加到程序,然后从程序中进行转储。有关选项的信息,请参见对 拆卸工的引用。
正如其他人提到的,平台的调试器是一个很好的起点。对于所有调试器和反汇编程序的手提钻,请看 IDA Pro.
在 Unix/Linux 平台(包括 Cygwin)上可以使用 objdump --disassemble <executable>。
objdump --disassemble <executable>
如果您自己构建程序,则可以要求编译器发出程序集源代码。对于大多数 UNIX 编译器,使用 -S开关。
-S
如果你正在使用 GNU 汇编程序,用 -g -Wa,-alh编译会在标准输出上给出混合的源代码和汇编(-Wa要求编译器驱动程序将选项传递给汇编程序,-al打开汇编列表,-ah添加“高级源代码”列表) :
-g -Wa,-alh
-Wa
-al
-ah
g++ -g -c -Wa,-alh foo.cc
对于 VisualStudio,使用 /FAsc。
/FAsc
如果你有编译好的二进制文件,
objdump -d a.out
dumpbin /DISASM foo.exe
调试器还可以显示反汇编。
disas
set disassembly-flavor intel
在 Visual Studio 中 ;
在 GCC/G + + 中,使用 -S编译。这将输出一个带汇编代码的 something.s文件。
something.s
编辑: 如果您希望输出采用 Intel 语法(这是 IMO 语法,更具可读性,而且大多数汇编教程都使用它) ,请使用 -masm=intel编译。
-masm=intel
大多数编译器都有输出汇编清单的选项:
cl.exe /FAfile.asm file.c
不过,为了获得最佳的可读性,大多数调试器将提供一个将反汇编与原始源交错的视图,因此您可以逐行将代码与编译器的输出进行比较。
在 VisualStudio 中,您可以为 C + + 项目生成汇编程序清单。
转到项目属性,然后转到 C + +/Output Files,并将 Assembler Output 设置和 ASM 列表位置设置为一个文件名。
许多人已经告诉如何使用给定的编译器发出汇编代码。另一种解决方案是编译一个目标文件,并使用诸如 Objecdump、 里德夫(Unix 上)或 DUMPBIN (链接)(Windows 上)这样的工具转储它。 您也可以转储可执行文件,但是读取输出会更加困难。
这样做的好处是可以以同样的方式使用任何编译器。
反汇编程序 用于32位 PE 文件。
对于 gcc/g + +
gcc -save-temps -fverbose-asm prog.c
这将生成 pro.s,其中包含对每一行中使用的变量的一些注释:
movl $42, -24(%ebp) #, readme movl -16(%ebp), %eax # pid, pid movl %eax, 4(%esp) # pid, movl $.LC0, (%esp) #, call printf #
如果您是 Eclipse 用户,则可以使用 反汇编视图。
反汇编视图将加载的程序显示为汇编程序 混合了源代码的指令进行比较 执行行由箭头标记指示,并在 您可以在“反汇编”视图中执行下列任务: 在任何汇编程序指令的开头设置断点 启用和禁用断点及其属性设置 逐步执行程序的反汇编指令 跳转到程序中的具体指令
反汇编视图将加载的程序显示为汇编程序 混合了源代码的指令进行比较 执行行由箭头标记指示,并在 您可以在“反汇编”视图中执行下列任务:
在 Intel Mac OS X 10.8(Mountain Lion)上,-masm=intel指令不起作用。但是,如果您已经安装了 Xcode,那么它应该已经安装了名为“ otool”的工具:
otool code.o -tV
必须提供已编译的对象代码作为参数。
你也可以试试这个网站: http://assembly.ynh.io/
在那里,您可以粘贴您的 C 或 C + + 代码,并按下蓝色按钮查看汇编等效版本。
这个网站目前为我工作(2017) : https://godbolt.org/