Tôi đang thực hiện một số thử nghiệm với lắp ráp x86-64. Sau khi biên soạn chức năng giả này:đăng ký đối số gcc tràn trên x86-64
long myfunc(long a, long b, long c, long d,
long e, long f, long g, long h)
{
long xx = a * b * c * d * e * f * g * h;
long yy = a + b + c + d + e + f + g + h;
long zz = utilfunc(xx, yy, xx % yy);
return zz + 20;
}
Với gcc -O0 -g
Tôi đã ngạc nhiên khi thấy những điều sau đây vào đầu lắp ráp của chức năng:
0000000000400520 <myfunc>:
400520: 55 push rbp
400521: 48 89 e5 mov rbp,rsp
400524: 48 83 ec 50 sub rsp,0x50
400528: 48 89 7d d8 mov QWORD PTR [rbp-0x28],rdi
40052c: 48 89 75 d0 mov QWORD PTR [rbp-0x30],rsi
400530: 48 89 55 c8 mov QWORD PTR [rbp-0x38],rdx
400534: 48 89 4d c0 mov QWORD PTR [rbp-0x40],rcx
400538: 4c 89 45 b8 mov QWORD PTR [rbp-0x48],r8
40053c: 4c 89 4d b0 mov QWORD PTR [rbp-0x50],r9
400540: 48 8b 45 d8 mov rax,QWORD PTR [rbp-0x28]
400544: 48 0f af 45 d0 imul rax,QWORD PTR [rbp-0x30]
400549: 48 0f af 45 c8 imul rax,QWORD PTR [rbp-0x38]
40054e: 48 0f af 45 c0 imul rax,QWORD PTR [rbp-0x40]
400553: 48 0f af 45 b8 imul rax,QWORD PTR [rbp-0x48]
400558: 48 0f af 45 b0 imul rax,QWORD PTR [rbp-0x50]
40055d: 48 0f af 45 10 imul rax,QWORD PTR [rbp+0x10]
400562: 48 0f af 45 18 imul rax,QWORD PTR [rbp+0x18]
gcc
rất lạ tràn tất cả các tham số đăng ký vào stack và sau đó mất chúng từ bộ nhớ cho các hoạt động tiếp theo.
Điều này chỉ xảy ra trên -O0
(với -O1
không có vấn đề gì), nhưng vẫn vậy, tại sao? Điều này có vẻ như một sự tối ưu hóa chống lại tôi - tại sao gcc
làm điều đó?
Tôi nghĩ rằng bạn có thể có nó ngược. Tôi khá chắc chắn ở trên là làm thế nào GCC luôn luôn (ban đầu) tạo ra mã, nó chỉ là bạn sẽ không bình thường nhìn thấy nó như nó được tối ưu hóa một cách trivially (nhưng tất nhiên chỉ khi tối ưu hóa được kích hoạt). – user786653
Đây không phải là chống tối ưu hóa, nó chỉ là không tối ưu hóa. – hirschhornsalz
Tôi vừa xem ví dụ này ở đâu đó: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ :-) –