Re: [FASM] Keylogger (support Unicode)
ReAl написав:[..] можна було при бажанні структуру switch/case/break/endswitch змусити генерувати таблицю переходів
Тоді інша справа. Але саморобні макро-реалізації завжди сумнівні.
Тю. «саморобні програми завжди сумнівні», асемблери, компілятори не треба використовувати взагалі.
Макроасемблер своєю природою призначений, щоб ним робили «саморобні» макро-реалізації того, що потрібно. Інакше — можна заданий набір можливостей забити жорстко у директиви і не витрачати сили на макромову.
На Сі, до речі, switch/case реалізується у результаті табличним методом,
тому там навпаки switch/case дуже сприяє ефективності коду.
Ой, «на Сі» swicth/case реалізується так, як компілятор вважає за потрібне.
І це залежить від архітектури (не x86/x64 єдиними), ключів компіляції і конкретного набору міток. Може бути таблиця, може бути дерево порівнювань/переходів.
Якщо мітки розріджені або їх небагато, то будуть прості порівнювання. Якщо багато і переважно підряд, ну може десь декілька дірок, то буде таблиця (в тих дірках просто стоятиме перехід на default чи за межі switch). Величина «багато» при цьому залежить від архітектури, для деяких архітектур звертання до таблиці адрес чи там перехід на обчислену адресу — відносно дорога операція.
(Не далі як учора замінював в себе конструкцію з послідовністю <cmp+jnz> на таблицю й то дало моментальне полегшення у модифікації вибору переходу, там було біля десяти case'ів).
«не далі як»™ кілька років тому виписував деревовидну реалізацію switch через cpi r24, xxx $ brne 10f, перевіряючи ті константи, обробка гілок яких довша у часі, — першими, а короткі гілки (які ще й рідше потрібні) можна й пізніше перевірити. Табличний перехід вимагав би збереження/відновлення у перериванні ще й r30, r31 і додаткових операцій, що разом робило б задовгою обробку найдовших гілок. В іншому місці в цій же програмі стоять табличні реалізації.
Всьому своє місце.