如何查看C++程序的汇编代码?
有哪些常用的工具可以实现这一功能?
如果您正在自己构建程序,您可以要求编译器生成汇编源代码。对于大多数UNIX编译器,请使用-S
开关。
如果您正在使用GNU汇编器,则使用-g -Wa,-alh
编译将在stdout上产生混合的源代码和汇编代码(-Wa
要求编译器驱动程序将选项传递给汇编程序,-al
打开汇编程序清单,-ah
添加“高级源”清单):
g++ -g -c -Wa,-alh foo.cc
对于Visual Studio,请使用/FAsc
。
如果您有一个已编译的二进制文件,则可以:
objdump -d a.out
(也适用于cygwin),dumpbin /DISASM foo.exe
。调试器也可以显示汇编代码。
disas
命令。set disassembly-flavor intel
。objdump -drwC -S
还可以混合源代码和汇编代码反汇编:如何使用GCC生成可读的汇编代码?。此外,有关从 gcc -O2 -S
获取漂亮输出的更多信息,请参见 如何从GCC / clang汇编输出中删除“噪音”?。 - Peter Cordes-S
编译。这将输出一个包含汇编代码的something.s
文件。-masm = intel
进行编译。-fverbose-asm
选项。 - osgx在 Visual Studio 中:
对于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 #
正如其他人提到的那样,您平台上的调试器是一个很好的起点。如果需要一款功能强大的调试器和反汇编器,请查看IDA Pro。
在Unix/Linux平台(包括Cygwin),您可以使用objdump --disassemble <executable>
命令。
大多数编译器都有输出汇编清单的选项。例如,使用VisualStudio时,您可以使用以下命令:
cl.exe /FAfile.asm file.c
为了更好的可读性,大多数调试器都会提供一种视图,将反汇编与原始源代码交错显示,这样您就可以逐行比较您的代码和编译器的输出。
Alt + 8
即可。 - jyz