x86-64 montajıyla deneme yapıyorum. Ben işlevin montaj başında aşağıdaki bulmak için sürpriz oldu gcc -O0 -g
ilegcc argümanı kaydı x86-64 üzerinde dökülüyor
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;
}
: Bu kukla işlevi derlenmiş olması
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
çok garip tüm argüman yığını üzerine kaydeder ve daha sonra alır dökülen Daha fazla operasyon için onları hafızadan.
Bu yalnızca -O0
'da (-O1
ile sorun yok) olur, ancak yine de neden? Bu bana bir anti-optimizasyon gibi görünüyor - neden gcc
bunu yapar?
Geriye doğru olabileceğini düşünüyorum. GCC'nin her zaman (başlangıçta) kodu nasıl ürettiğine göre, eminim ki, normalde onu basitçe optimize edilmiş olarak görmüyorsunuz (ancak tabi ki sadece optimizasyonlar etkinse). – user786653
Bu, anti optimizasyon değil, yalnızca optimizasyon değil. – hirschhornsalz
Bu örneği bir yerlerde daha önce görmüştüm: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ :-) –