Сейчас на форуме: _MBK_, tyns777, UniSoft (+11 невидимых)

 eXeL@B —› Программирование —› Генерируемый компиляторами код.
Посл.ответ Сообщение


Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 05 июля 2012 20:50 · Поправил: neomant
· Личное сообщение · #1

Часто сталкиваюсь с подобным кодом:
Code:
  1. CODE:005BA819                 jz      loc_5BA8A8
  2. CODE:005BA81F                 xor     eax, eax        ; if (Result != 0) {
  3. CODE:005BA821                 mov     al, [ebp+var_030]
  4. CODE:005BA824                 cmp     eax, 84
  5. CODE:005BA827                 jge     short loc_5BA84B
  6. CODE:005BA829                 cmp     eax, 67
  7. CODE:005BA82C                 jg      short loc_5BA83F
  8. CODE:005BA82E                 jz      short loc_5BA88D
  9. CODE:005BA830                 add     eax, -52
  10. CODE:005BA833                 sub     eax, 2
  11. CODE:005BA836                 jb      short loc_5BA86E ; if (var_030 < 54)
  12. CODE:005BA838                 sub     eax, 2
  13. CODE:005BA83B                 jz      short loc_5BA88D
  14. CODE:005BA83D                 jmp     short loc_5BA8A8

Не придавал этому раньше значения. Все же не оптимальнее было бы генерировать одну арифметическую инструкцию вместо двух или здесь есть какой-то скрытый умысел?

-----
Следуй за белым кроликом





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 июля 2012 20:53 · Поправил: reversecode
· Личное сообщение · #2

весть код покажите

это оптимизированый switch() case такой




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 05 июля 2012 22:35
· Личное сообщение · #3

neomant
Это обычный (не табличный switch), такой код компилятор генерит когда расстояние между некоторыми соседними case больше определенной величины, а другие последовательные case идут более часто. Компилятор таким образом разбивает весь switch на блоки, где add eax, -52 одно из межблочных расстояний.

-----
Everything is relative...





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 05 июля 2012 22:50
· Личное сообщение · #4

Да, оптимизированный до неузнаваемости switch. По крайней мере я затрудняюсь привести его в первоначальное состояние, легче if else. Так значит особого смысла в паре инструкций add eax, -52, sub eax, 2 нет и можно их считать одной операцией?

-----
Следуй за белым кроликом





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 июля 2012 23:42 · Поправил: reversecode
· Личное сообщение · #5

neomant пишет:
Да, оптимизированный до неузнаваемости switch

у меня есть два файла скомпилированых gcc разных версий
ранняя версия скомпилировала со switch,
а позняя уже заоптимизировала в if else
в хексрее это кошманый стоетажный домик

neomant пишет:
Так значит особого смысла в паре инструкций add eax, -52, sub eax, 2 нет и можно их считать одной операцией?

смысла нет, можно считать



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 06 июля 2012 00:35
· Личное сообщение · #6

reversecode пишет:
у меня есть два файла скомпилированых gcc разных версий

Только что собрал семпл на 4.6
Code:
  1. 0040137A   .  83F8 08       CMP EAX,8
  2. 0040137D   .  77 3F         JA SHORT TestCass.004013BE
  3. 0040137F   .  8B0485 2C3040>MOV EAX,[DWORD DS:EAX*4+40302C]
  4. 00401386   .  FFE0          JMP EAX
  5. 00401388   .  FF45 F0       INC [DWORD SS:EBP-10]
  6. 0040138B   .  EB 31         JMP SHORT TestCass.004013BE
  7. 0040138D   .  8345 F0 02    ADD [DWORD SS:EBP-10],2
  8. 00401391   .  EB 2B         JMP SHORT TestCass.004013BE
  9. 00401393   .  8345 F0 03    ADD [DWORD SS:EBP-10],3
  10. 00401397   .  EB 25         JMP SHORT TestCass.004013BE
  11. 00401399   .  8345 F0 04    ADD [DWORD SS:EBP-10],4
  12. 0040139D   .  EB 1F         JMP SHORT TestCass.004013BE
  13. 0040139F   .  8345 F0 05    ADD [DWORD SS:EBP-10],5
  14. 004013A3   .  EB 19         JMP SHORT TestCass.004013BE
  15. 004013A5   .  8345 F0 06    ADD [DWORD SS:EBP-10],6
  16. 004013A9   .  EB 13         JMP SHORT TestCass.004013BE
  17. 004013AB   .  8345 F0 07    ADD [DWORD SS:EBP-10],7
  18. 004013AF   .  EB 0D         JMP SHORT TestCass.004013BE
  19. 004013B1   .  8345 F0 08    ADD [DWORD SS:EBP-10],8
  20. 004013B5   .  EB 07         JMP SHORT TestCass.004013BE


Без оптимизации, а с оптимизацией эта сволочь выкидывала switch.
Code:
  1.     int i = 1;
  2.     srand(time(NULL));
  3.     switch(rand() + MessageBox(0, "", "", 2))
  4.     {
  5.     case 0:
  6.         i+=1;
  7.         break;
  8.  
  9.     case 7:
  10.         i+=8;
  11.         break;
  12.  
  13.     case 8:
  14.         i=10;
  15.         break;
  16.     }
  17.     printf("%X\n", i);





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 06 июля 2012 10:18 · Поправил: neomant
· Личное сообщение · #7

F_a_u_s_t пишет:
Только что собрал семпл на 4.6

Вроде как код и исходный код неэквивалентны.

Разобрался почему не мог причесать код в изначальный switch. Код писан на Delphi, а пытался его повторить на C, в котором в блоке switch нельзя задать диапазон значений. --C.

-----
Следуй за белым кроликом




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 06 июля 2012 10:45
· Личное сообщение · #8

neomant пишет:
Вроде как код и исходный код неэквивалентны.

Я лишнее просто выкинул.
Эта сцука во время сборки считает и подставляет константы, а так да, после cl код gcc кажется странным.


 eXeL@B —› Программирование —› Генерируемый компиляторами код.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати