首页 > 解决方案 > x86_64 gcc 调试模式:为什么加减法中有额外的指令?

问题描述

我写了以下片段。

int Add(int x, int y) {
    return x+y;
}

int Subtract(int x, int y) {
    return x-y;
}

int main() {
    bool flag = false;
    int x=10,y=5,z;

    if (flag) {
        z = Add(x,y);
    }
    else {
        z = Subtract(x,y);
    }
}

但是当我查看生成的汇编代码时,该函数Add有一条额外的指令。

0000000000000000 <_Z3Addii>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   89 7d fc                mov    %edi,-0x4(%rbp)
   7:   89 75 f8                mov    %esi,-0x8(%rbp)
   a:   8b 55 fc                mov    -0x4(%rbp),%edx
   d:   8b 45 f8                mov    -0x8(%rbp),%eax
  10:   01 d0                   add    %edx,%eax
  12:   5d                      pop    %rbp
  13:   c3                      retq   

0000000000000014 <_Z8Subtractii>:
  14:   55                      push   %rbp
  15:   48 89 e5                mov    %rsp,%rbp
  18:   89 7d fc                mov    %edi,-0x4(%rbp)
  1b:   89 75 f8                mov    %esi,-0x8(%rbp)
  1e:   8b 45 fc                mov    -0x4(%rbp),%eax
  21:   2b 45 f8                sub    -0x8(%rbp),%eax
  24:   5d                      pop    %rbp
  25:   c3                      retq

我觉得类似的指令序列(如Subtract)会起作用。我错过了什么?

标签: cgccassembly

解决方案


推荐阅读