首页 > 解决方案 > 为什么 g++ 编写调用下一条指令的代码?

问题描述

我在 windows 上使用 g++ 编译了以下代码,以测试构造函数和析构函数调用的确切位置:

class foo{
    volatile int x;
    public:
    foo(){
        x = 9;
        return;
    }
    ~foo(){
        x = 10;
        return;
    }
};
int main(){
    volatile int x = 7;
    if(x == 7){
        volatile foo jjj;
        volatile int y = 8;
        if(y == 8){
            goto out;
        }
        y = 10;
    }
    out:
    x = 10;
}

然后我反汇编了这个对象,我没有找到对构造函数或析构函数的调用。另外,我发现调用下一行的奇怪指令。

0000000000000000 <main>:
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
   4:   48 83 ec 30             sub    rsp,0x30
   8:   e8 00 00 00 00          call   d <main+0xd>            ; calling next line
   d:   c7 45 fc 07 00 00 00    mov    DWORD PTR [rbp-0x4],0x7
  14:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
  17:   83 f8 07                cmp    eax,0x7
  1a:   0f 94 c0                sete   al
  1d:   84 c0                   test   al,al
  1f:   74 38                   je     59 <main+0x59>
  21:   48 8d 45 f8             lea    rax,[rbp-0x8]
  25:   48 89 c1                mov    rcx,rax
  28:   e8 00 00 00 00          call   2d <main+0x2d>         ; calling next line
  2d:   c7 45 f4 08 00 00 00    mov    DWORD PTR [rbp-0xc],0x8
  34:   8b 45 f4                mov    eax,DWORD PTR [rbp-0xc]
  37:   83 f8 08                cmp    eax,0x8
  3a:   0f 94 c0                sete   al
  3d:   84 c0                   test   al,al
  3f:   75 09                   jne    4a <main+0x4a>
  41:   c7 45 f4 0a 00 00 00    mov    DWORD PTR [rbp-0xc],0xa
  48:   eb 01                   jmp    4b <main+0x4b>
  4a:   90                      nop
  4b:   48 8d 45 f8             lea    rax,[rbp-0x8]
  4f:   48 89 c1                mov    rcx,rax
  52:   e8 00 00 00 00          call   57 <main+0x57>         ; calling next line
  57:   eb 01                   jmp    5a <main+0x5a>
  59:   90                      nop
  5a:   c7 45 fc 0a 00 00 00    mov    DWORD PTR [rbp-0x4],0xa
  61:   b8 00 00 00 00          mov    eax,0x0
  66:   48 83 c4 30             add    rsp,0x30
  6a:   5d                      pop    rbp
  6b:   c3                      ret    
  6c:   90                      nop
  6d:   90                      nop
  6e:   90                      nop
  6f:   90                      nop

这些电话的目的是什么?另外,构造函数和析构函数调用在哪里?

标签: c++assemblydisassembly

解决方案


推荐阅读