Obecnie uczę się języków programowania złożonego i języka C. Mam kilka pytań na ten temat.Montaż w porównaniu z kodem C
kod C
int arith(int x, int y, int z) {
int t1 = x + y;
int t2 = z*48;
int t3 = t1 & 0xFFFF;
int t4 = t2 * t3;
return t4;
}
kod Zgromadzenie
movl 16(%ebp),%eax z
leal (%eax,%eax,2), %eax z*3
sall $4,%eax t2 = z*48
movl 12(%ebp),%edx y
addl 8(%ebp),%edx t1 = x+y
andl $65535,%edx t3 = t1&0xFFFF
imull %edx,%eax Return t4 = t2*t3
Zamiast Leal, a następnie przesunięcie o 4 pomnożyć oo przez 48, może po prostu użyć imull $ 48,% eax?
Jest to również kilkakrotne użycie rejestru% edx. Czy to oznacza, że t1 jest nadpisywane? Innymi słowy, czy nadal będę w stanie odzyskać t1 tuż przed t4, jeśli chcę?
Tak, Nie (Zmienna "t1" jest zoptymalizowana z dala) i Nie. Dla ostatniego pytania 'x + y' jest obliczane, ale nigdy nie zapisane. _EDX_ miał wartość 'x + y' po' addl 8 (% ebp),% edx', ale instrukcja 'andl 65535,% edx' ją niszczy. Jeśli przeniesiesz _EDX_ do rejestru takiego jak _ECX_ po 'addl 8 (% ebp),% edx', to nadal będziesz miał dostęp do części x + y obliczeń. –
Cool. Czy kod C byłby naprawdę przetłumaczony za kulisami w taki sposób, aby nie zapisywał każdej zmiennej we własnym rejestrze? – Dylan
Nie, jeśli nie jest to konieczne. Taka jest moc kompilatora optymalizującego. – usr2564301