Comments 21
Это было реализовано ещё в компиляторах прошлого века: бинарный поиск + массивы для плотно расположенных меток. Собственно, это достаточно простая оптимизация с точки зрения реализации и, при этом, даёт заметный выигрыш в скорости. Потому в компиляторах 90-х она уже и была реализована.
P.S. Вероятно, не в малой степени из-за взрывного распространения GUI в 90-х с его case-switch event loop: и в X11, и в Win16, и в Win32 это так (API OS/2 плохо помню, но, по-моему, там так же).
P.P.S. А, и да, автор поделился радостью исследования кода, генерируемого GCC без оптимизации. Только вот это не имеет никакого отношения к реальной обратной разработке: тот же GCC без -O1/-O2 для конечного продукта практически не используется и упомянутая оптимизация case-switch там есть.
Ошибка в названии статьи, в первом предложении — дальше читать не стал.
<sаrcasm>
Написал на C
, собрал
Выдернул листинг
Но что то не бьётся с вашей статьей
8001258: 681a ldr r2, [r3, #0]
800125a: 2380 movs r3, #128 ; 0x80
800125c: 049b lsls r3, r3, #18
800125e: 4013 ands r3, r2
8001260: d1f0 bne.n 8001244 <HAL_RCC_OscConfig+0x588>
8001262: e038 b.n 80012d6 <HAL_RCC_OscConfig+0x61a>
</sаrcasm>
Первый пример с условным переходом с уровнем оптимизации -O1 уже выраждается в следующее:
/ (fcn) sym.main 54
| sym.main ();
| ; var int local_8h @ ebp-0x8
| ; var int local_4h @ esp+0x4
| 0x0000051d 8d4c2404 lea ecx, dword [local_4h]
| 0x00000521 83e4f0 and esp, 0xfffffff0
| 0x00000524 ff71fc push dword [ecx - 4]
| 0x00000527 55 push ebp
| 0x00000528 89e5 mov ebp, esp
| 0x0000052a 53 push ebx
| 0x0000052b 51 push ecx
| 0x0000052c e8effeffff call sym.__x86.get_pc_thunk.bx
| 0x00000531 81c3a71a0000 add ebx, 0x1aa7
| 0x00000537 83ec0c sub esp, 0xc
| 0x0000053a 8d8308e6ffff lea eax, dword [ebx - 0x19f8]
| 0x00000540 50 push eax
| 0x00000541 e86afeffff call sym.imp.puts
| 0x00000546 83c410 add esp, 0x10
| 0x00000549 8d65f8 lea esp, dword [local_8h]
| 0x0000054c 59 pop ecx
| 0x0000054d 5b pop ebx
| 0x0000054e 5d pop ebp
| 0x0000054f 8d61fc lea esp, dword [ecx - 4]
\ 0x00000552 c3 ret
Режим графов — ваш друг в дизасcемблировании :)
Наконец-то встретил в сети единомышленника: )
Почему-то реверсеры не любят граф, хотя он ведь наиболее совместим с нашим зрением, чем одномерное полотно строчек.
Дизассемблируем циклы, написанные на Си