我有以下 C++ 代码:
int main(){
int a = 1;
double d = 1.2;
return 0;
}
并使用 GCC 6.2 -m32 获得以下程序集:
main:
lea ecx, [esp+4]
and esp, -8
push DWORD PTR [ecx-4]
push ebp
mov ebp, esp
push ecx
sub esp, 20
mov DWORD PTR [ebp-12], 1
fld QWORD PTR .LC0
fstp QWORD PTR [ebp-24]
mov eax, 0
add esp, 20
pop ecx
pop ebp
lea esp, [ecx-4]
ret
.LC0:
.long 858993459
.long 1072902963
并使用 MS CL 19:
_d$ = -12 ; size = 8
_a$ = -4 ; size = 4
_main PROC
push ebp
mov ebp, esp
sub esp, 12 ; 0000000cH
mov DWORD PTR _a$[ebp], 1
movsd xmm0, QWORD PTR __real@3ff3333333333333
movsd QWORD PTR _d$[ebp], xmm0
xor eax, eax
mov esp, ebp
pop ebp
ret 0
_main ENDP
我有几个问题。
GCC 版本中的前三行是什么意思?
lea ecx, [esp+4]and esp, -8push DWORD PTR [ecx-4]MS CL 版本分配 12 个字节,4 个用于 int,8 个用于 double:
sub esp, 12 // that's great.但是为什么 GCC 分配了 24?
push ecxsub esp, 20