![]() |

 |
|
Домой |
Статьи |
RAR-cтатьи |
Форум |
Программирование |
Скачать |
DVD-ROM
|
|
|
|
Новичку |
FAQ |
Ссылки |
Интервью |
Архив |
Новости |
Связь |
|
Сейчас на форуме: vovanchik-77, SVLab (+5 невидимых пользователей) |
 |
|
| Посл.ответ |
Сообщение |
|
Создано: 6 июля 2009 16:58:09 · Поправил: LKS128 Личное сообщение #1
Имеется процедура написанная на дельфях. Общий вид:
- procedure foo
- var i,j :integer
- begin
- // ... code
-
- i := (i * j) div 255
-
- // ... code
- end
i := (i * j) div 255; Эта операция жрёт половину времени процедуры. Замена на i := round((i * j) / 255); немного улучшает ситуацию, но не намного. Есть ли какие-нибудь варианты оптимизации?
|
|
|
Создано: 14 июля 2009 15:31:40 · Поправил: multiarc Личное сообщение #2
Вот например как можно умножить быстро int на int (пример для умножения на 34)
- mov eax,int1
- mov edx,eax
- shl eax, 1
- shl edx, 5
- add eax,edx
- mov res,eax
фактически мы просто умножаем по частям, сначала на 32, потом на 34-32, т.е. 2. для любого другого числа просто можно посмотреть какие выставлены биты и по похожей технике умножать на любое число, т.е. любой int.
|
|
Создано: 15 июля 2009 17:59:17 Личное сообщение #3
Jupiter пишет: прилагаю тулзу Magic Divider, созданную The Svin (я эту тулзу малость причесал) Кстати рекомендую использовать оригинальную утилиту от The Svin. Не знаю что там Jupiter правил кроме интерфейса, но результаты правленный вариант выдаёт неправильные в отличии от оригинала. Деление на 10. The Svin version:
- MagicNumber = 3435973837
- mov eax,X
- mov edx, MagicNumber
- mul edx
- SHR edx, 3
Jupiter version:
- MagicNumber = CCCCCCCDh
- mov eax,X
- mov edx,MagicNumber
- mul edx
- shr edx,33
Это если ввести вначале делитель 10000, а потом делитель 10 - будет такая ерунда. При первом вычислении всё Ок. И плюс оригинал с исходниками распространяется. ;)
|
|
Создано: 16 июля 2009 10:25:40 Личное сообщение #4 |
|
Создано: 17 июля 2009 10:36:09 Личное сообщение #5
Да, сейчас всё ок. Кстати, если уж развивать утилиту, было бы неплохо добавить вариант для знакового деления. Сейчас код и магические константы генерируются для беззнакового деления.
|
|
Создано: 17 июля 2009 10:45:13 Личное сообщение #6
cppasm собственно алгоритм я не трогал бага вылезла в ф-ции udw2str из библиотеки masm32, которая в новой версии masm32, не добавляла завершающий 0 в нужном месте.
----- EnJoy!
|
|
| Вы находитесь на форуме сайта CRACKLAB.RU |
|