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


Answers:


167

询问编译器

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

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

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

  • 对于Visual Studio,请使用/FAsc

窥探二进制

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

使用您的调试器

调试器也可能显示混乱。

  • disas在GDB中使用命令,
  • 或Windows上Visual Studio 的反汇编窗口

35

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

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


5
还添加-fverbose-asm选项
osgx 2010年


14

对于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  #


6

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

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


6

无论使用哪种调试器,都应具有汇编视图(Visual Studio,Borland IDE,gdb等)。如果您不使用调试器,而只想查看程序中的程序集,则可以使用反汇编器,或者运行该程序,并使用调试器将其附加并从那里进行转储。有关选项的信息,请参见反汇编程序的参考。


5

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

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


如果有让编译器生成汇编器的选项(例如gcc -S或下面的VS / FA选项),则比反汇编要好。它更具象征意义。
Marco van de Voort,2009年

当然,如果您有出处。
Ori Pessach,2009年

2
顺便说一下,您会惊讶于IDA Pro可以推断出多少符号信息。
Ori Pessach,2009年

5

大多数编译器都可以选择输出程序集列表。例如,使用VisualStudio,您可以使用类似以下内容的东西:

cl.exe /FAfile.asm file.c

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



3

您也可以尝试以下网站:http : //assembly.ynh.io/

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


仅供参考,无法加载
kaiwan,2018年

是的,早在2015年,它就运作良好,然后突然停止。然后是ctoassembly.com,但它仅适用于C的一小部分。发生了相同的事情:不再加载。太糟糕了。
Gomes

2

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

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


1

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

otool code.o -tV

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


0

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

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

  • 在任何汇编程序指令的开头设置断点
  • 启用和禁用断点及其设置属性
  • 逐步执行程序的反汇编指令
  • 跳至程序中的特定说明

你能详细说明一下吗?
Peter Mortensen 2014年

在MSVC中调试时,也有程序集视图
phuclv 2014年

我目前没有可使用的Eclipse C ++开发环境,但是这里是官方文档:help.eclipse.org/kepler/…–
Pieter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.