асм для кода вида:
if (arr[i+1]=1) or (arr[i+2]=2) or (arr[i+3]=3) or (arr[i+4]=4) then ...
тут видно, что непонятно зачем компилятор постоянно обращается к памяти, считывает в регистр, не изменяет его и снова тоже самое туда считывает... это не оптимально
Можно ли написать анализатор+патчер для такого рода кода, чтобы такие повторные лишние обращения к памяти он просто заNOPливал?
Причём повторюсь - сделать такое на уже готовом бинарнике
Ну ты чуданул! Можно, но, наверное, пока только на основе паттернов. Чтобы распознавать бесполезные инструкции - это надо такую систему умную писать, строк на 100 000.
ну я именно только этот вариант подобный хочу обработать к примеру идём с точки входа, каждую инструкцию построчно анализируем и строим карту регистров, что в них содержится... если встречаем очередную инструкцию, загружающую в регистр тоже самое - то НОПим её
Так это лучше через регулярки сделать. Написать правило с опкодами, которое ищет определенный опкод, между ними что-то любое (любых до 20 байт, к примеру, или пока не встретим байт-исключение) и после - какие-то ещё опкоды. Если есть такое выражение - NOP.
А ещё уже такой инструмент есть. Но он не совсем для такого, но для теста пойдёт - Yara называется.
та не ну не совсем прям этот пример только, а все подобные... где данные берутся из памяти постоянно заносятся регистр, но память может быть разная.... для разных блоков которые обрабатывать
Так всё равно через регулярки решается. Yara для начала можно использовать, он может даже динамически анализировать.
ну не знаю... мне же джампы учитвать ещё нужно, реты, ярой наверное тут не обделаться )
а у fpc опции -O2 нету?, ааа на бинарнике
Есть, даже -О4 есть Но что FPC, что Delphi имеют очень слабые оптимизаторы, что вот такой вот кот получсется
это с -O4 ?
Да, там оптимизаторы что в дельфе, что в фпц такие вот
Обсуждают сегодня