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

时间:2009-05-08 15:15:20

标签: c++ assembly disassembly

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

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

14 个答案:

答案 0 :(得分:155)

询问编译器

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

  • 如果您正在使用GNU汇编程序,则使用-g -Wa,-alh进行编译将在stdout上提供混合源和汇编(-Wa要求编译器驱动程序将选项传递给汇编程序,-al转在汇编列表中,-ah添加“高级源”列表):

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

  • 对于Visual Studio,请使用/FAsc

查看二进制文件

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

使用调试器

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

答案 1 :(得分:31)

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

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

答案 2 :(得分:21)

在Visual Studio中;

  1. 设置断点
  2. 运行程序直到它在断点处停止
  3. 右键点击源代码并选择“show dissasembly”

答案 3 :(得分:12)

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

答案 4 :(得分:7)

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

答案 5 :(得分:6)

您使用的调试器应该具有程序集视图(Visual Studio,Borland IDE,gdb等)。如果您没有使用调试器并且只想查看程序中的程序集,则可以使用反汇编程序,或者运行程序并使用调试程序附加程序并从那里执行转储。有关选项的信息,请参阅disassemblers的参考。

答案 6 :(得分:6)

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

这样可以使用任何编译器以相同的方式工作。

答案 7 :(得分:5)

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

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

答案 8 :(得分:5)

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

cl.exe /FAfile.asm file.c

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

答案 9 :(得分:4)

PE Explorer Disassembler用于32位PE文件。其他人的IDA。

答案 10 :(得分:3)

您也可以尝试使用此网站:http://assembly.ynh.io/

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

答案 11 :(得分:2)

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

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

答案 12 :(得分:1)

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

otool code.o -tV

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

答案 13 :(得分:0)

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

  

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

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