我怎样才能看到C ++程序的汇编代码?
我怎样才能看到C ++程序的汇编代码?
什么是stream行的工具来做到这一点?
询问编译器
如果您自己构build程序,则可以要求编译器发出程序集源代码。 对于大多数UNIX编译器使用-S
开关。
-
如果你正在使用GNU汇编程序,使用
-g -Wa,-alh
编译-g -Wa,-alh
会在标准输出中给出混合的源代码和程序集(-Wa
要求编译器驱动程序将选项传递给汇编程序,-al
打开汇编列表,-ah
添加“high水平来源“列表):g++ -g -c -Wa,-alh foo.cc
-
对于Visual Studio,使用
/FAsc
。
窥视二进制
如果你编译了二进制文件,
- 在UNIX上使用
objdump -d a.out
(也适用于cygwin), - 在Windows上
dumpbin /DISASM foo.exe
。
使用你的debugging器
debugging器也可以反汇编。
- 在GDB中使用
disas
命令, - 或者Windows上Visual Studio的反汇编窗口 。
在GCC / G ++中,用-S
编译。 这将输出一个汇编代码的something.s
。
编辑:如果你想输出英特尔语法(这是国际海事组织,更可读,大多数汇编教程使用它),编译与 – -masm=intel
。
在Visual Studio中 ;
- 设置一个断点
- 运行程序直到它停在断点处
- 右键单击源代码并select“show dissasembly”
对于gcc / g ++
gcc -save-temps -fverbose-asm prog.c
这将生成prog.s,并在每个asm行中使用一些variables注释:
movl $42, -24(%ebp) #, readme movl -16(%ebp), %eax # pid, pid movl %eax, 4(%esp) # pid, movl $.LC0, (%esp) #, call printf #
很多人已经告诉过如何用给定的编译器发出汇编代码。 另一个解决scheme是编译一个目标文件,并使用objdump , readelf (在Unix)或DUMPBIN( 链接 )(在Windows上)等工具转储它。 您也可以转储一个可执行文件,但是读取输出会更困难。
这与任何编译器的工作方式相同。
无论你使用的debugging器应该有一个程序集视图(Visual Studio,Borland IDE,gdb等)。 如果您没有使用debugging器,而只想查看程序中有哪些程序集,则可以使用反汇编程序,或者运行程序并使用debugging程序附加到该程序,然后从那里进行转储。 有关选项的信息,请参阅反汇编程序的参考。
正如其他人所说,平台的debugging器是一个很好的起点。 对于所有debugging器和反汇编器的手提钻,请看看IDA Pro。
在Unix / Linux平台上(包括Cygwin),你可以使用objdump --disassemble <executable>
。
大多数编译器都可以select输出汇编列表。 例如VisualStudio,你可以使用类似于:
cl.exe /FAfile.asm file.c
尽pipe为了获得最佳的可读性,大多数debugging器都会提供一个视图,将反汇编与原始数据源交错,因此您可以逐行比较代码和编译器的输出。
用于32位PE文件的PE Explorer反汇编器 。 IDA为他人。
你也可以试试这个网站: http : //assembly.ynh.io/
在那里,你可以粘贴你的C或C ++代码,并按下一个蓝色button来查看程序集的等效版本。
在Visual Studio中,您可以生成C ++项目的汇编程序列表。
转到项目属性,然后转到C ++ / Output Files,并将汇编器输出设置和ASM列表位置设置为文件名。
这个网站目前正在为我工作(2017): https : //godbolt.org/
在Intel Mac OS X 10.8(Mountain Lion)上, -masm=intel
指令不起作用。 但是,如果您安装了Xcode ,则应该安装名为“otool”的工具:
otool code.o -tV
您必须提供编译的目标代码作为参数。
如果您是Eclipse用户,则可以使用“ 反汇编”视图 。
反汇编视图将加载的程序显示为与源代码混合的汇编指令以进行比较。 当前正在执行的行由箭头标记指示,并在视图中突出显示。 您可以在反汇编视图中执行以下任务:
- 在任何汇编程序指令的开始处设置断点
- 启用和禁用断点及其设置属性
- 逐步完成程序的反汇编指令
- 跳转到程序中的具体说明