如何查看 C + + 程序的汇编代码?

如何查看 C + + 程序的汇编代码?

有什么流行的工具可以做到这一点?

115161 次浏览

无论使用什么调试器,都应该有一个汇编视图(VisualStudio、 BorlandIDE、 gdb 等)。如果您不使用调试器,而只是想查看程序中的程序集,那么您可以使用反汇编程序,或者可以选择运行程序并用调试器附加到程序,然后从程序中进行转储。有关选项的信息,请参见对 拆卸工的引用。

正如其他人提到的,平台的调试器是一个很好的起点。对于所有调试器和反汇编程序的手提钻,请看 IDA Pro.

在 Unix/Linux 平台(包括 Cygwin)上可以使用 objdump --disassemble <executable>

问问编译器

如果您自己构建程序,则可以要求编译器发出程序集源代码。对于大多数 UNIX 编译器,使用 -S开关。

  • 如果你正在使用 GNU 汇编程序,用 -g -Wa,-alh编译会在标准输出上给出混合的源代码和汇编(-Wa要求编译器驱动程序将选项传递给汇编程序,-al打开汇编列表,-ah添加“高级源代码”列表) :

    g++ -g -c -Wa,-alh foo.cc

  • 对于 VisualStudio,使用 /FAsc

看看二进制

如果你有编译好的二进制文件,

使用调试器

调试器还可以显示反汇编。

  • 在 GDB 中使用 disas命令。
    如果喜欢 Intel 语法,可以使用 set disassembly-flavor intel
  • 或 Windows 上 VisualStudio 的 拆卸窗口

在 Visual Studio 中 ;

  1. 设置断点
  2. 运行程序,直到程序在断点处停止
  3. 右键点击源代码,选择“显示反汇编”

在 GCC/G + + 中,使用 -S编译。这将输出一个带汇编代码的 something.s文件。

编辑: 如果您希望输出采用 Intel 语法(这是 IMO 语法,更具可读性,而且大多数汇编教程都使用它) ,请使用 -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/