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

158

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

有哪些常用的工具可以实现这一功能?


微软 Visual C++ Express 只需要设置一个断点,然后按下 Alt + 8 即可。 - jyz
可能重复:https://dev59.com/FHVC5IYBdhLWcg3w9GE9 - legends2k
相关内容:如何从GCC/clang汇编输出中去除“噪音”?包括创建简单函数的提示,其汇编代码很有趣(例如函数参数而不是常量),以及链接到Matt Godbolt的CppCon演讲,介绍了编译器输出中要注意的内容。 - Peter Cordes
14个回答

193

询问编译器

如果您正在自己构建程序,您可以要求编译器生成汇编源代码。对于大多数UNIX编译器,请使用-S开关。

  • 如果您正在使用GNU汇编器,则使用-g -Wa,-alh编译将在stdout上产生混合的源代码和汇编代码(-Wa要求编译器驱动程序将选项传递给汇编程序,-al打开汇编程序清单,-ah添加“高级源”清单):

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

  • 对于Visual Studio,请使用/FAsc

查看二进制文件

如果您有一个已编译的二进制文件,则可以:

使用调试器

调试器也可以显示汇编代码。

  • 在GDB中使用disas命令。
    如果您喜欢Intel语法,请使用set disassembly-flavor intel
  • 或者,在Windows上使用Visual Studio的反汇编窗口

我输入了disas命令,它起作用了!但是你能告诉我如何在Intel语法中查看它吗? - Stranger Forever
1
请注意,objdump -drwC -S 还可以混合源代码和汇编代码反汇编:如何使用GCC生成可读的汇编代码?。此外,有关从 gcc -O2 -S 获取漂亮输出的更多信息,请参见 如何从GCC / clang汇编输出中删除“噪音”? - Peter Cordes

38
在GCC/G++中,使用-S编译。这将输出一个包含汇编代码的something.s文件。
编辑:如果您想要以英特尔语法(在我看来更易读,并且大多数汇编教程都使用它)输出,请使用-masm = intel进行编译。

6
请添加-fverbose-asm选项。 - osgx
如果这对您无效,请确保大写字母S。 - Marc Miller

25

在 Visual Studio 中:

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

16

对于gcc/g++编译器

gcc -save-temps -fverbose-asm prog.c

这将生成带有每个汇编行中使用变量注释的prog.s:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #

14

6
无论您使用哪个调试器(Visual Studio、Borland IDE、gdb等),都应该有汇编视图。如果您没有使用调试器,只是想查看程序中的汇编代码,可以使用反汇编器或者运行程序并使用调试器附加到程序上,在那里进行转储。有关选项的信息,请参见反汇编器的参考资料。

6
许多人已经介绍了如何使用给定的编译器发出汇编代码的方法。另一种解决方案是编译一个目标文件,并用工具objdumpreadelf(在Unix上),或 DUMPBIN(link) (在Windows上)将其转储。您也可以转储可执行文件,但读取输出会更加困难。
这种方法的优点是可以与任何编译器一起使用。

5

正如其他人提到的那样,您平台上的调试器是一个很好的起点。如果需要一款功能强大的调试器和反汇编器,请查看IDA Pro。

在Unix/Linux平台(包括Cygwin),您可以使用objdump --disassemble <executable>命令。


如果有一个选项可以让编译器生成汇编代码(例如gcc -S,或下面的VS /FA选项),那就比反汇编更好。它更具象征意义。 - Marco van de Voort
当然,如果你有源代码的话。 - Ori Pessach
2
顺便说一句,您会惊讶地发现IDA Pro可以推断出多少符号信息。 - Ori Pessach

5

大多数编译器都有输出汇编清单的选项。例如,使用VisualStudio时,您可以使用以下命令:

cl.exe /FAfile.asm file.c

为了更好的可读性,大多数调试器都会提供一种视图,将反汇编与原始源代码交错显示,这样您就可以逐行比较您的代码和编译器的输出。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接