|
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 | Просмотров: 14270
Добавить комментарий
|
|