147

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

有哪些流行的工具可以做到这一点?

4

14 回答 14

181

询问编译器

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

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

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

  • 对于 Visual Studio,使用/FAsc.

窥视二进制文件

如果您有已编译的二进制文件,

使用你的调试器

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

  • disas在 GDB 中使用命令。如果您更喜欢 Intel 语法,
    请使用。set disassembly-flavor intel
  • 或者Windows上Visual Studio的反汇编窗口
于 2009-05-08T15:22:52.277 回答
37

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

编辑:如果您希望输出采用 Intel 语法(这是 IMO,更具可读性,并且大多数汇编教程都使用它),请使用-masm=intel.

于 2009-05-08T15:25:44.487 回答
25

在 Visual Studio 中

  1. 设置断点
  2. 运行程序直到它在断点处停止
  3. 右键单击源代码并选择“显示分解”
于 2009-05-08T15:23:17.237 回答
15

对于 gcc/g++

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

这将生成 prog.s,其中包含对每个 asm 行中使用的变量的一些注释:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #
于 2010-02-08T17:08:12.280 回答
14

该网站目前正在为我工​​作(2017):https ://godbolt.org/

于 2017-04-25T14:39:17.707 回答
6

无论您使用什么调试器,都应该有一个汇编视图(Visual Studio、Borland IDE、gdb 等)。如果您没有使用调试器,而只想查看程序中的程序集,则可以使用反汇编程序,或者运行程序并使用调试器附加到它,然后从那里进行转储。有关选项的信息,请参阅对反汇编程序的参考。

于 2009-05-08T15:19:41.473 回答
6

很多人已经告诉过如何使用给定的编译器生成汇编代码。另一种解决方案是编译一个目标文件并使用objdumpreadelf(在 Unix 上)或 DUMPBIN( link )(在 Windows 上)等工具转储它。您也可以转储可执行文件,但读取输出会更加困难。

这具有与任何编译器以相同方式工作的优点。

于 2009-05-08T17:38:56.117 回答
5

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

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

于 2009-05-08T15:22:26.257 回答
5

大多数编译器都有输出汇编列表的选项。例如,使用 VisualStudio,您可以使用以下内容:

cl.exe /FAfile.asm file.c

不过,为了获得最佳可读性,大多数调试器都会提供一个将反汇编与原始源代码交错的视图,因此您可以逐行将代码与编译器的输出进行比较。

于 2009-05-08T15:25:46.247 回答
4

用于 32 位 PE 文件的PE Explorer 反汇编程序。其他人的 IDA。

于 2009-07-17T23:51:00.757 回答
3

你也可以试试这个网站:http ://assembly.ynh.io/

在那里,您可以粘贴您的 C 或 C++ 代码,然后按蓝色按钮查看程序集等效版本。

于 2015-08-01T05:50:44.550 回答
2

在 Visual Studio 中,您可以为 C++ 项目生成汇编程序列表。

转到项目属性,然后转到 C++/Output Files 并将 Assembler 输出设置和 ASM 列表位置设置为文件名。

于 2009-05-08T16:46:19.033 回答
1

在 Intel Mac OS X 10.8 (Mountain Lion) 上,该-masm=intel指令不起作用。但是,如果你安装了Xcode,它应该已经安装了名为 'otool' 的工具:

otool code.o -tV

您必须提供已编译的目标代码作为参数。

于 2012-08-20T13:40:07.577 回答
0

如果您是 Eclipse 用户,您可以使用Disassembly 视图

反汇编视图将加载的程序显示为与源代码混合的汇编指令以进行比较。当前执行的行由箭头标记指示并在视图中突出显示。您可以在反汇编视图中执行以下任务:

  • 在任何汇编指令的开头设置断点
  • 启用和禁用断点及其设置属性
  • 逐步执行程序的反汇编指令
  • 跳转到程序中的特定指令
于 2011-02-28T08:08:30.633 回答