私はx86-64アセンブリを試しています。私は、関数の集合の先頭に次のように見つけて驚いたgcc -O0 -g
でgcc引数レジスタが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;
}
:このダミー関数をコンパイルした
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
は非常に不思議なすべての引数がスタックに登録して、取りこぼしますさらなる操作のためにそれらをメモリから削除する。
これは-O0
で発生します(問題がない場合は-O1
)が、それでもなぜですか?これは私にとって反最適化のようです - なぜgcc
はそれをしますか?
あなたはそれを後方に持っているかもしれないと思います。私は、GCCが常に(最初は)コードを生成する方法であると確信しています。それは、通常は最適化されているので、通常は表示されません(ただし、最適化が有効な場合のみです)。 – user786653
これは反最適化ではなく、最適化されていないだけです。 – hirschhornsalz
私はちょうどこの例をどこかで見た:http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ :-) –