Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Использование языка ассемблера — это один из наиболее действенных методов оптимизации программ, и во многом методы, используемые для повышения производительности, схожи с теми, что используются в языках высокого уровня. Однако язык ассемблера предоставляет программисту и ряд дополнительных возможностей. Я не буду повторять то, что уже сказано в контексте оптимизации с использованием средств языков высокого уровня, а выделю методы, свойственные только ассемблеру.

Использование языка ассемблера во многом решает проблему избыточности программного кода. Ассемблерный код более компактен, чем его аналог на языке высокого уровня. Чтобы убедиться в этом, достаточно сравнить дизассемблированные листинги одной и той же программы, написанной на ассемблере и на языке высокого уровня. Сгенерированный компилятором языка высокого уровня ассемблерный код даже с использованием опций оптимизации не устраняет избыточность кода приложения. -В то же время язык ассемблера позволяет разрабатывать короткий и эффективный код.
• Программный модуль на ассемблере обладает, как правило, более высоким быстродействием, чем написанный на языке высокого уровня. Это связано с меньшим числом команд, требуемых для реализации фрагмента кода. Меньшее число команд быстрее выполняется центральным процессором, что, соответственно, повышает производительность программы.
• Можно разрабатывать отдельные модули полностью на ассемблере и присоединять их к программам на языке высокого уровня. Также можно использовать мощные встроенные средства языков высокого уровня для написания ассемблерных процедур непосредственно в теле основной программы. Такие возможности предусмотрены во всех языках высокого уровня. Эффективность использования встроенного ассемблера может быть очень высока. Встроенный ассемблер позволяет добиваться максимального эффекта при оптимизации математических выражений, программных циклов и обработки массивов данных в основной программе.

Оптимизация с учетом специфических особенностей процессора

В основе оптимизации с учетом специфических особенностей процессора лежат особенности архитектуры конкретного типа процессора Intel. Он представляет собой расширение варианта оптимизации с использованием языка ассемблера.

Мы будем рассматривать варианты оптимизации только для процессоров Pentium. Каждая последующая модель процессора обычно имеет дополнительные архитектурные улучшения по сравнению с предыдущей. В то же время все модели процессоров Pentium имеют и общие характеристики. Поэтому оптимизация на уровне процессора может проводиться как на основе общих характеристик всего семейства, так и с учетом особенностей каждой модели.
Оптимизация программного кода на уровне процессора позволяет повысить производительность не только приложений на языке высокого уровня, но и процедур, написанных на ассемблере. Программисты, пишущие на языках высокого уровня, практически незнакомы с этой методикой оптимизации и используют ее относительно редко, хотя возможности ее безграничны. Разработчики ассемблерных программ и процедур иногда используют возможности новых типов процессоров.
Должен заметить, что и более ранние типы процессоров Intel включают дополнительные команды, которые редко применяются разработчиками, но позволяют сделать программный код более эффективным.
Какие возможности процессора можно использовать для оптимизации?
Прежде всего, будет полезным выравнивание данных и адресов по границам 32-разрядных слов. Кроме того, все процессоры, начиная с 80386, обладают расширенными вычислительными возможностями, которые можно использовать для оптимизации программ. Такие возможности появились благодаря дополнительным командам и расширению возможностей адресации операндов.
Производительность программ можно увеличить, используя:
• команды пересылки с нулевым или знаковым расширением (movzx или movsx);
• установки в байте значений "истина" или "ложь" в зависимости от содержимого флагов центрального процессора, что позволяет избавиться от команд условного перехода (setz, setc и т. д.);
• команды проверки, установки, сброса и сканирования битов (bt, btc. btr, bts, bsp, bsr);
• обобщенную индексную адресацию и режимы адресации с масштабированием индексов;
• быстрое умножение при помощи команды lea с использованием масштабированной индексной адресации;
• перемножение 32-разрядных чисел и деление 64-разрядного числа на 32-разрядное;
• операции для обработки многобайтных массивов данных и строк.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru