在反汇编中保存不必要的堆栈上下文?

时间:2017-06-15 15:34:33

标签: macos assembly x86 clang x86-64

(使用Apple LLVM version 8.1.0 (clang-802.0.42) Target: x86_64-apple-darwin16.6.0

当反汇编用-O2编译的一些代码时,我注意到很多代码看起来似乎没有必要保存和恢复基本指针rbp,通常看起来像下面的

pushq %rbp
movq  %rsp, %rbp
...
popq  %rbp

我知道这会是什么,但它似乎甚至在看似完全没必要的情况下使用,例如在objdump

发出的以下反汇编的复杂身份函数中
__Z8identityI5arrayIiLm2EEET_S2_:
  60:   55  pushq   %rbp
  61:   48 89 e5    movq    %rsp, %rbp
  64:   48 89 f8    movq    %rdi, %rax
  67:   5d  popq    %rbp
  68:   c3  retq
  69:   0f 1f 80 00 00 00 00    nopl    (%rax)

其中只有两个有意义的指令是从rdi移动到rax(第一个参数到返回寄存器)和明显必要的retq(我假设nopl是用于填充或对齐以后的任何内容。)

这个看似不必要的上下文保存是否有原因?

0 个答案:

没有答案