21

Re: [FASM] Keylogger (support Unicode)

dosprog написав:
ReAl написав:

[..] можна було при бажанні структуру switch/case/break/endswitch змусити генерувати таблицю переходів

Тоді інша справа. Але саморобні макро-реалізації завжди сумнівні.

Тю. «саморобні програми завжди сумнівні», асемблери, компілятори не треба використовувати взагалі.
Макроасемблер своєю природою призначений, щоб ним робили «саморобні» макро-реалізації того, що потрібно. Інакше — можна заданий набір можливостей забити жорстко у директиви і не витрачати сили на макромову.

dosprog написав:

На Сі, до речі, switch/case реалізується у результаті табличним методом,
тому там навпаки switch/case дуже сприяє ефективності коду.

Ой, «на Сі» swicth/case реалізується так, як компілятор вважає за потрібне.
І це залежить від архітектури (не x86/x64 єдиними), ключів компіляції і конкретного набору міток. Може бути таблиця, може бути дерево порівнювань/переходів.
Якщо мітки розріджені або їх небагато, то будуть прості порівнювання. Якщо багато і переважно підряд, ну може десь декілька дірок, то буде таблиця (в тих дірках просто стоятиме перехід на default чи за межі switch). Величина «багато» при цьому залежить від архітектури, для деяких архітектур звертання до таблиці адрес чи там  перехід на обчислену адресу — відносно дорога операція.

dosprog написав:

(Не далі як учора замінював в себе конструкцію з послідовністю <cmp+jnz> на таблицю й то дало моментальне полегшення у модифікації вибору переходу, там було біля десяти case'ів).

«не далі як»™ кілька років тому виписував деревовидну реалізацію switch через cpi r24, xxx $ brne 10f, перевіряючи ті константи, обробка гілок яких довша у часі, — першими, а короткі гілки (які ще й рідше потрібні) можна й пізніше перевірити. Табличний перехід вимагав би збереження/відновлення у перериванні ще й r30, r31 і додаткових операцій, що разом робило б задовгою обробку найдовших гілок. В іншому місці в цій же програмі стоять табличні реалізації.
Всьому своє місце.

printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON");
Подякували: leofun011

22 Востаннє редагувалося dosprog (31.05.2018 13:53:31)

Re: [FASM] Keylogger (support Unicode)

То є так.
Наприклад, якщо case'и можуть бути тільки послідовними цілими в інтервалі [0..MAX],
тоді табличний метод виправданий практично завжди, якщо  MAX>3 (орієнтовно).
Наприклад, при перекодуванні ASCII-тексту однозначні переваги табличного методу "гілкування".
Якщо ж case'и мають не послідовні значення (ак у темі цього топіка), тоді доцільність табличного метода
знижується, й "тупий" метод <cmp+jnz> сповна має право на використання.

..До речі, у Сі-компілятора є ключі компіляції "за розміром" або "за швидкістю".
Значною мірою це стосується способу реалізації switch'ів.
Дійсно, файл із таблицею переходів буде більшим завдяки додатковим таблицям,
але виконання переходів буде швидшим
(але не завжди, а тільки якщо case'ів більше, ніж якесь порогове число.
Завдання компілятора це число знайти та прийняти рішення про метод реалізації switch'ів).

У аттачі два EXE-файли, отримані трансляцією зразка у стартовому пості теми,
- відтрансльовані один з таблицями переходів, інший без них.
Розмір порівняти можна, швидкість роботи порівняти можна тільки теоретично.

..Але, потестувавши фрагмент із переходами окремо, можна сказати,
що у даному конкретному випадку конструкція з таблицею переходів
(30 case'ів та їхні рандомні значення не з діапазону [1..30]) -
ця конструкція буде працювати разів у п'ять повільніше, ніж простий варіант перебору <cmp+jnz>.
Тут маємо 30 case'ів, - тому, щоб отримати переваги від застосування
табличного методу, треба мати більше, ніж 200 case'ів.

І тому у зразку коду зі стартового посту теми сміливо замінюємо використання макро case/switch
серією порівнянь <cmp+jnz>, й усе буде працювати гарно.
.

Post's attachments

JUMP_T.ZIP 4.03 kb, 36 downloads since 2018-05-31 

23 Востаннє редагувалося dosprog (31.05.2018 13:51:53)

Re: [FASM] Keylogger (support Unicode)

ReAl написав:

Тю. «саморобні програми завжди сумнівні», асемблери, компілятори не треба використовувати взагалі.

) Ля, всьому ж є межа. Одна справая, якщо реалізуються якісь примітиви, це буває потрібно.
А інша, коли намагаються відтворити синтаксис мови високого рівня. То аби похизуватись
та зробити непортабельний код.
Он, доречі, були такі забаганки із "програмуванням tasm російською мовою",
суцільне макробуйство, але в межах:
-> Тиць <-.