Ассемблерные вставки в циклах

Motorcode, 2009
Uraniumcode@gmail.com



Оптимизация. Испольщование ассемблерных вставок вместо циклов в Pascal и в C++.

Я думаю все когда что — то программировали, использовали циклы. Это и не удивительно, циклы — это одна из основ программирования и без них никуда. В больших приложениях, их количество может быть очень большим. Но что делать когда циклов много, а программа работает не так быстро как хотелось бы? Не убирать же их жертвуя функциями. Для этого существует оптимизация программного кода или проще — оптимизация. Каждый слово «оптимизация» понимает по разному. Для одних это заключение повторяющихся фрагментов кода в функции, а для других включение ассемблерных вставок в программный код. Последнее, мне видится, наиболее предпочтительным из — за реального ускорения работы программы. Этим мы и займёмся. Ведь ничто не сближает человека с машиной, как Ассемблер(без пошлостей).
Примеры будут на Pascal и на С++. Почему? Потому что они мне больше нравятся. Сразу говорю, что данная статья не рассматривается как пособие по Ассемблеру или другому языку программирования. Если что — то не понятно, то лучше ознакомится с учебниками.
Итак, начнем. Сначала примеры будут на Pascal. Первым делом напишем цикл так как это делают все люди.

Листинг 1.1

function func:Integer;
var
i:Integer;
begin
for i := 0 to 20 do
writeln(i);
end;

Тут всё понятно, поэтому напишем тоже самое, только с помощью Ассемблера
Листинг 1.2

function func:Integer;
var
i:Integer;
begin
i := 0;
asm
mov ecx,i //Копируем i в ecx
@@tr: //организуем цикл
mov i,ecx //копируем ecx в i
inc ecx //увеличиваем ecx на едницу
cmp ecx,20 //сравниваем ecx с 20
jne @@tr //если не равно, то продолжаем цикл 
end;
writeln(i); //Выводим результат
end;

А вот тут помимо комментариев нужны дополнительные комментарии. Во — первых, регистр ecx выбран, конечно, не случайно. Он и должен отвечать за циклы, потому как о является счётчиком. Объявляем цикл приккаждом проходе через mov I, ecx, I увеличивается на единицу как и ecx, при проходе через inc eax. Потом ecx сравнивается с 20 и если они равны то цикл заканчивается и выводится значение. В принципе всё довольно просто, а скорость прибавится.
Теперь рассмотрим тоже самое, только касательно С++. Для начала напишем цикл так как он выглядит стандартно.
Листинг 1.3

Int main()
{
for(int I = 0;i < 10;i++)
cout << i
return 0;
}

Теперь не теряя времени переходим к Ассемблеру:
Листинг 1.4

int main()
{
int i = 0;
__asm
{
mov ecx,i //Копируем i в ecx
tr: //организуем цикл
mov i,ecx //копируем ecx в i
inc ecx //увеличиваем ecx на едницу
cmp ecx,20 //сравниваем ecx с 20
jne tr //если не равно, то продолжаем цикл 
}
cout << i;
return 0;
}

Впринципе всё было обяснено выше, добавлю только что по правилая языка C++, всавки пишуться как __asm{//код}.
Предел оптимизации не знает границ. Прибольшом желаниии и умении мужно достичь болььших высот. Мы только начали этот путь. Всем удачи и терпения!


Автор: Uranium | Добавлено: 11.8.2009, 12:51 | Просмотров: 14151
Добавить комментарий


Лучшие программы
Будильник
Lim BurnDisc
Радио плеер
Lim BackUp
Календарь праздников
Телефонный справочник
Аудио конвертер
LimNote
Стикеры
Таймер выключения
Женский календарь
Клавиатурный тренажер
Lim Block Folder
Lim Screenshot
Lim Tree Note
Lim Soft Catalog
Lim Quick Panel
Lim Frame Photo
Lim Image Marker
Lim Flash Security
Lim Launcher
Lim Mosaic Draw
Рисовалка для детей (Котики)
Школьный звонок
Lim Catalog Articles
Lim Anti Boss
Рисовалка для детей (Машинки)
...

Игры
Пасьянс Паганини
Игра_2048
Игра Cursor Run
Пасьянс Косынка
Пасьянс Паук
Игра Server War
Server War History AI
Складское дело
Крестики - Нолики 5 в линию
Сапер
Точки и квадраты
Судоку

Программы
Блог
Комментарии
произошла ошибка, ис...
Ужасно неудобная гос...
Согласен трансляция ...
P.s. Практически каж...
...
Добрый день! Как исп...
День добрый! недавно...
Все исправлено. Спас...
Добрый день! Исправь...
Добрый день на 10ке,...
Группа VK
Поделиться





Копилка MaxLim.

Если Вам понравилась наша программа, Вы можете купить нам кофе (или кофемашину) или пивка для поднятия настроения и ускорения написания новых программ и обновлений :), Пополните копилку и разработка программ ускорится :)...
Пополнить копилку можно несколькими способами:

1. Переводом через Сбербанк Онлайн - Платежи, Перевод клиенту сбербанка по номеру телефона "Номер телефона - +79284741288" -сумма перевода в рублях.
2. Кошелек Яндекс Деньги - 41001737394948
3. Через донаты...

Контакты для связи:
Skype - go_ramalex
mail - maxlim_soft@mail.ru

Яндекс.Метрика PR-CY.ru Яндекс цитирования
MaxLim.org - Сайт Компании MaxLim http://vsofte.biz MaxLim.org - Сайт programs.lv SoftOut.ru - Сайт SoftOut.ru  

Copyright MaxLim © 2007-2023