我将clang
编译的代码的输出与-m32
进行了比较,并且没有,并且不禁注意到64位部分缺少堆栈指针寄存器的递增和递减。每种方法。
32位:
main: # @main
push ebp
mov ebp, esp
sub esp, 8 # here
mov eax, 0
mov dword ptr [ebp - 4], 10
mov dword ptr [ebp - 8], 5
add esp, 8 # and here
pop ebp
ret
64位:
main: # @main
push rbp
mov rbp, rsp
mov eax, 0
mov dword ptr [rbp - 4], 10
mov dword ptr [rbp - 8], 5
pop rbp
ret
使用clang 3.5.1编译并且未启用任何优化。
为什么呢?与{32}对应物相比,x86-64
在堆栈方面有何不同?
我还注意到,有些编译器,即gcc
和icc
,有时会减少堆栈指针,但在离开方法后永远不会递增它们?或者有时需要更多? gcc
从堆栈中获取16 bytes
个步骤。 icc
做了一些完全疯狂的事情。