Sto facendo qualche esperimento con l'assembly x86-64. Dopo aver compilato questa funzione fittizia:argomento gcc registro che si rovescia su 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;
}
Con gcc -O0 -g
Sono rimasto sorpreso di trovare quanto segue all'inizio del montaggio della funzione:
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
riversa in modo molto strano tutto argomento registra nello stack e poi prende li dalla memoria per ulteriori operazioni.
Questo succede solo su -O0
(con -O1
non ci sono problemi), ma ancora, perché? Questo mi sembra un anti-ottimizzazione: perché lo farebbe gcc
?
Penso che potresti averlo indietro. Sono abbastanza sicuro che quanto sopra è come GCC genera sempre (inizialmente) il codice, è solo che non lo vedrete normalmente perché è banalmente ottimizzato (ma ovviamente solo se le ottimizzazioni sono abilitate). – user786653
Questo non è l'anti-ottimizzazione, non è solo l'ottimizzazione. – hirschhornsalz
Avevo appena visto questo esempio da qualche parte: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ :-) –