В настоящее время я изучаю сборку и языки программирования C, и у меня есть несколько вопросов об этом.Сборка по сравнению с кодом C
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;
}
код Ассамблеи
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
Вместо использования Лил, а затем переход на 4 умножить г на 48, я мог просто использовать imull $ 48,% EAX?
Кроме того, это несколько раз используется регистр% edx. Означает ли это, что t1 перезаписывается? Другими словами, смогу ли я получить t1 прямо перед t4, если захочу?
Да, Нет (переменная 't1' оптимизирована) и №. Для последнего вопроса' x + y' вычисляется, но никогда не сохраняется. _EDX_ имел значение 'x + y' после' addl 8 (% ebp),% edx', но команда 'andl $ 65535,% edx' уничтожает его. Если вы переместили _EDX_ в регистр типа _ECX_ после 'addl 8 (% ebp),% edx', то у вас все равно будет доступ к x + y части вычисления. –
Прохладный. Действительно ли код C был бы переведен за кулисы таким образом, что он не сохранил бы каждую переменную в своем собственном регистре? – Dylan
Нет, если в этом нет необходимости. Это сила оптимизирующего компилятора. – usr2564301