Ассемблер, почему дизассемблированном коде много ненужных операций?

Очень часто такое вижу, когда есть избыточная установка регистра.
for (int i = 0; i < 10; i++)
 xor         ecx,ecx  
            {
                a1 += arr[i];
 mov         eax,ecx   ;# !!!!!! ДЛЯ ЧЕГО Это
 add         ebx,dword ptr [rbp+rax*4+10h]  
            for (int i = 0; i < 10; i++)
 inc         ecx  
 cmp         ecx,0Ah  
 jl          AsmLearn.Program.Main(System.String[])+0CAh (07FFDF34840AAh)  
            }

Часто встречаю в ассемблере, вот такие инструкции, типа такого, для чего там делается
присвоение счетчика в eax?
Почему не переписать вместо этого
add ebx,dword ptr [rbp+ECX*4+10h]
  • Вопрос задан
  • 523 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему не переписать вместо этого
add ebx,dword ptr [rbp+ECX*4+10h]

Буквально так написать нельзя, потому что нет такого режима адресации в котором можно было бы использовать вместе Rbp (64-битный) и Ecx (32-битный). Можно было бы написать add ebx,dword ptr [rbp+rcx*4+10h], но для этого счётчик цикла должен был бы быть 64-битным, а он, как мы видим, 32-битный (int i). Т.е. ответ на вопрос "для чего это": для беззнакового расширения 32-битного счётчика цикла в регистр, который можно использовать для доступа к памяти.

Другое дело, что из исходного кода очевидно, что при обращениях к памяти i не выходит из диапазона 0..9, так что разницы между ecx и rcx нет и не может быть. Возможно я что-то упускаю и у компилятора другое мнение на этот счёт, но может быть он просто туповат и не имеет кода который бы мог использовать эту возможность оптимизации, а может такая оптимизация и есть, но она не была включена во время генерации этого кода.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы