CRACKL@B Оригинальный DVD-ROM крэкера: CRACKL@B DVD !
Домой | Статьи | RAR-cтатьи | Форум | Программирование | Скачать | DVD-ROM
Новичку | FAQ | Ссылки | Интервью | Архив | Новости | Связь


Русский / Russian English / Английский

Сейчас на форуме: vovanchik-77, SVLab (+5 невидимых пользователей)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 CRACKL@B —› Программирование —› Оптимизация (int * int) div int
<< . 1 . 2 .
Посл.ответ Сообщение
LKS128

Ранг: 8.6 (гость)
Статус: Участник

Создано: 6 июля 2009 16:58:09 · Поправил: LKS128
Личное сообщение #1

Имеется процедура написанная на дельфях.
Общий вид:

Code:
  1. procedure foo;
  2. var i,:integer;
  3. begin
  4.   // ... code
  5.  
  6.   i := (* j) div 255;
  7.  
  8.   // ... code
  9. end;


i := (i * j) div 255;
Эта операция жрёт половину времени процедуры.

Замена на i := round((i * j) / 255);
немного улучшает ситуацию, но не намного.

Есть ли какие-нибудь варианты оптимизации?
multiarc


Ранг: 57.1 (постоянный)
Статус: Участник

Создано: 14 июля 2009 15:31:40 · Поправил: multiarc
Личное сообщение #2

Вот например как можно умножить быстро int на int (пример для умножения на 34)
Code:
  1. mov eax,int1
  2. mov edx,eax
  3. shl eax, 1
  4. shl edx, 5
  5. add eax,edx
  6. mov res,eax

фактически мы просто умножаем по частям, сначала на 32, потом на 34-32, т.е. 2.
для любого другого числа просто можно посмотреть какие выставлены биты и по похожей технике умножать на любое число, т.е. любой int.
cppasm

Ранг: 113.6 (ветеран)
Статус: Участник

Создано: 15 июля 2009 17:59:17
Личное сообщение #3

Jupiter пишет:
прилагаю тулзу Magic Divider, созданную The Svin
(я эту тулзу малость причесал)

Кстати рекомендую использовать оригинальную утилиту от The Svin.
Не знаю что там Jupiter правил кроме интерфейса, но результаты правленный вариант выдаёт неправильные в отличии от оригинала.
Деление на 10.
The Svin version:
Code:
  1. MagicNumber = 3435973837
  2. mov eax,X
  3. mov edx, MagicNumber
  4. mul edx
  5. SHR edx, 3


Jupiter version:
Code:
  1. MagicNumber = CCCCCCCDh
  2. mov      eax,X
  3. mov      edx,MagicNumber
  4. mul      edx
  5. shr      edx,33

Это если ввести вначале делитель 10000, а потом делитель 10 - будет такая ерунда.
При первом вычислении всё Ок.
И плюс оригинал с исходниками распространяется. ;)
Jupiter


Ранг: 357.7 (мудрец)
Статус: Участник
Research & Development

Создано: 16 июля 2009 10:25:40
Личное сообщение #4

cppasm
спасиб за отчёт, баг поправил

6c3c_16.07.2009_CRACKLAB.rU.tgz - MagicDivider.v1.04.rar

-----
EnJoy!
cppasm

Ранг: 113.6 (ветеран)
Статус: Участник

Создано: 17 июля 2009 10:36:09
Личное сообщение #5

Да, сейчас всё ок.
Кстати, если уж развивать утилиту, было бы неплохо добавить вариант для знакового деления.
Сейчас код и магические константы генерируются для беззнакового деления.
Jupiter


Ранг: 357.7 (мудрец)
Статус: Участник
Research & Development

Создано: 17 июля 2009 10:45:13
Личное сообщение #6

cppasm
собственно алгоритм я не трогал
бага вылезла в ф-ции udw2str из библиотеки masm32, которая в новой версии masm32, не добавляла завершающий 0 в нужном месте.

-----
EnJoy!
<< . 1 . 2 .
 CRACKL@B —› Программирование —› Оптимизация (int * int) div int
    Для печати 


Оригинальный DVD-ROM крэкера: CRACKL@B DVD !


Вы находитесь на форуме сайта CRACKLAB.RU
Проект ReactOS