@daniil14056

Лишняя инструкция в дизассемблированном коде ассемблера?

Тут смотрю код дизассемблированный. И не догоняю, там явно одна лишняя вообще ни чего не делающая инструкция.
сначала mov ptr , eax
потом mov eax,ptr ;/// Еах же не разу не изменилась после первой инструкции.


23:             A[] a = new A[10]; // A структура
01960889 B9 FA 14 71 01       mov         ecx,17114FAh  
0196088E BA 0A 00 00 00       mov         edx,0Ah  
01960893 E8 94 29 DA FF       call        CORINFO_HELP_NEWARR_1_VC (0170322Ch)  
01960898 89 45 B0             mov         dword ptr [ebp-50h],eax   ; ЧТО ЭТО
0196089B 8B 45 B0             mov         eax,dword ptr [ebp-50h]  ; <b>ЗАЧЕМ???</b> eax же не изменится
0196089E 89 45 C0             mov         dword ptr [ebp-40h],eax
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Просто компиляция без оптимизации.
Ответ написан
dollar
@dollar
Делай добро и бросай его в воду.
Могу ошибаться, но похоже на разогрев памяти - чтение двух ячеек, между которым расположился массив, чтобы этот участок памяти попал в кэш процессора для последующего быстрого доступа к этому участку. Возможно, там далее по коду будет перебор массива.
Ответ написан
@VitalyChaikin
Компилятор работает с некоторыми блоками*
блок1 - он откомпилировал
блок2 - снова откомпилировал
для него что происходит в блок1 и блок2 тёмный лес, и то что последняя инструкция из блок1 и первая из блока2 делают одно и тоже - совершенно не очевидно. Просто так совпало.
Ответ написан
Ваш ответ на вопрос

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

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