上山打老虎 发表于 2021-7-1 10:42:41

【工欲善其事,必先利其器】之怎么查看c++代码生成的汇编代码

  本篇文章讲解怎么得到c++代码对应的汇编代码,想要真正的理解一段代码到底是怎么执行的,还是要从汇编的层面去看,那怎么得到一段c++代码所对应的汇编代码呢,下面为你介绍三种方式。
1. gcc编译生成XXX.s文件
  一般来讲,给你一个cpp文件,比如test.cpp,然后我们编译都是直接g++ test.cpp这样简单直接的方式,但其实它中间有很多个过程的,包含预处理、编译、链接等过程,而这其中的编译这个过程其实就是生成了汇编文件。
  比如对于一个cpp文件,我们执行下列命令:
g++ -E test.cpp -o test.i#预处理过程
g++ -S test.i -o test.s#编译过程  这样生成test.s就是test.cpp所对应的汇编代码,当然我们也可以一步到位,直接使用g++ -S test.cpp -o test.s也是可以的。
2. 使用objdump命令得到汇编代码
  linux下的objdump命令用于从可执行文件或者目标文件中显示某些信息,所以用它也可以得到可执行文件对应的汇编代码。
  比如对于test.cpp,可以使用如下的命令得到汇编指令:
g++ test.cpp -o test
objdump -d test  通过这样的方式能看到可执行文件所对应的汇编指令。
3. 使用gdb命令得到汇编代码
  第1、2两种情况下得到的都是编译期间生成的汇编指令,但因为有些代码是运行时才能确定的原因,所以运行时的汇编指令与编译时并不完全一致,比如栈的地址,编译期间其实是不知道的,运行时才会真正的分配。
  我们可以使用gdb来获取每一行代码运行时所对应的汇编指令,首先使用g++ -g test.cpp -o test来得到可执行文件,然后gdb ./test进入gdb模式,比如对于这段c++代码:
#include <iostream>
using namespace std;

int main()
{
    int size = 1000;
    size = 10000;
    int arr;

    return 0;
}  使用如下gdb命令可得到对应的汇编指令:
(gdb) b main
Breakpoint 1 at 0x4006a4: file test.cpp, line 10.
(gdb) set disassemble-next-line on#打开汇编指令开关,这样gdb每执行一步,都会打印出来对应执行的汇编指令
(gdb) r
Starting program: /root/a.out

Breakpoint 1, main () at test.cpp:10
10      return 0;
=> 0x00000000004006a4 <main()+8>:    48 89 e0    mov    %rsp,%rax
   0x00000000004006a7 <main()+11>:    48 89 c1    mov    %rax,%rcx
(gdb) next
6      int size = 1000;
=> 0x00000000004006aa <main()+14>:    c7 45 fc e8 03 00 00    movl   $0x3e8,-0x4(%rbp)
(gdb)
7      size = 10000;
=> 0x00000000004006b1 <main()+21>:    c7 45 fc 10 27 00 00    movl   $0x2710,-0x4(%rbp)  这样看起问题来就很方便了,我们能看到每一行c++代码对应的汇编指令是什么,对于初学者而言,使用此种方式是最为方便的。
*好了,本篇文章就为大家介绍到这里,觉得内容对你有用的话,记得顺手点个赞哦~*
页: [1]
查看完整版本: 【工欲善其事,必先利其器】之怎么查看c++代码生成的汇编代码