Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Использование ассемблера для оптимизации программ на С++ - Магда Ю.С.

Магда Ю.С. Использование ассемблера для оптимизации программ на С++ — БХВ-Петербург , 2004. — 496 c.
ISBN 5-94157-414-2
Скачать (прямая ссылка): ispolzovaniyaassemblera2004.djvu
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 127 >> Следующая

_asm {
mov EDX, DWORD PTR il mov ECX, DWORD PTR i2
Глава 2. Оптимизация вычислительных алгоритмов с помощью ассемблера
87
)
lea EAX, 3[-100][EDX+ECX] mov DWORD PTR ires, EAX
}
printf("Calculated result = %d\n", ires);
}
return 0;
Исходный текст программы довольно прост и нет необходимости давать какие-либо разъяснения. Вид окна работающего приложения показан на рис. 2.8.
:i!¦::к? >,ahi::гча?<р: 1 \Rяi> it¦:у;.];!!Vа г!-:f. й;:!i:tм-jl;ч*-;**&:¦-:1 j,|
0
Рис. 2.8. Окно приложения, демонстрирующего использование команды загрузки адреса для выполнения математических операций
Мы рассмотрели далеко не полный набор математических функций ассемблера. Главная цель — убедить читателя в полной мере использовать математический сопроцессор в программах на ассемблере. При желании можно модифицировать существующие или написать свои собственные математические алгоритмы, которых нет в языках высокого уровня.
Преимущества ассемблера проявляются и при обработке строк и массивов данных. Для выполнения таких операций была разработана целая группа команд, в терминологии Intel именуемая командами строковых примитивов. Под обработкой строк мы будем понимать выполнение следующих операций:
? сравнение двух строк;
? копирование строки-отправителя в строку-получатель;
? считывание строк из устройства или файла;
? запись строки в устройство или файл;
? определение размера строки;
? нахождение подстроки в заданной строке;
? объединение двух строк (конкатенация).
88
Часть I. Основы эффективного программирования на ассемблере
Операции над строками широко используются в языках высокого уровня. Ассемблерная реализация таких операций позволяет существенно повысить быстродействие программ на языках высокого уровня, особенно если требуется обработать большое число строк и массивов. Рассмотрим вначале основные команды языка ассемблера для обработки строк.
Строка символов или чисел, с которыми программа работает как с группой, является обычным типом данных. Программа пересылает строку из одного места в другое, сравнивает ее с другими строками, а также ищет в ней заданное значение. Обычным типом данных является строка символов.
Программа представляет каждое слово, предложение либо другую структуру последовательностью символов в памяти. Функции редактирования, например, в большой степени используют операции поиска и пересылки. Строковые команды процессора выполняют эти операции с минимальными программными затратами, а также при минимальном времени исполнения.
Сначала давайте обсудим принципы работы со строками. Программа может выполнять строковые операции над байтами, словами и двойными словами.
Строковые команды не применяют способы адресации, используемые остальными командами обработки. Они адресуют операнды комбинациями регистров ESI ИЛИ EDI.
Операнды источника используют регистр esi, а операнды результата — регистр edi. Все строковые команды корректируют адрес после выполнения операции. Строка может состоять из нескольких элементов, но команды обработки строк могут обрабатывать только один элемент в каждый момент времени. Автоматический инкремент (увеличение) или декремент (уменьшение) адреса операнда позволяет быстро обрабатывать строковые данные. Флаг направления (Direct Flag) в регистре состояния определяет направление обработки строк.
Если он равен 1, то адрес уменьшается, а если он сброшен в 0, то адрес увет личивается. Сама величина инкремента или декремента адреса определяется размером операнда. Например, для символьных строк, в которых размер операндов равен 1 байту, команды обработки строк изменяют адрес на 1 после каждой операции. Если обрабатывается массив целых чисел, в котором каждый операнд занимает 4 байта, то строковые команды изменяют адрес на 4. После выполнения операции указатель адреса в регистрах esi или edi ссылается на следующий элемент строки.
Рассмотрим представление строк в разных языках программирования. Наиболее часто используются строки с завершающим нулем (null-terminated strings). Они используются в языке Сив операционных системах Windows. Вот как выглядит такая строка на языке ассемблера
String_0 DB "NULL-TERMINATED STRING", О
Гпава 2. Оптимизация вычислительных алгоритмов с помощью ассемблера
89
Мы будем рассматривать в основном строки с завершающим нулем. Можно выделить пять основных команд для работы со строками. Часто эти команды называют командами строковых примитивов. К ним относятся:
? movs — команда для перемещения строки данных из одного участка памяти в другой;
? lods — команда загрузки строки, адрес которой указан в регистре esi, в регистр-аккумулятор еах (ах, ad;
П stos — команда сохранения содержимого регистра еах (ах, al) в памяти по адресу, указанному в регистре edi;
? cmps — команда сравнения строк, расположенных по адресам, содержащимся в регистрах esi и edi;
? seas — команда сканирования строк, которая сравнивает содержимое регистра еах (ах, ad с содержимым памяти, определяемым регистром
EDI.
Каждая команда обработки строк имеет три допустимых формата. Например, команда movs может иметь одно из представлений: movsb, movsw, movsd. Команда movsb может использоваться только для работы с однобайтовыми операндами, movsw — для работы со словами, a movsd — для работы с двойными словами. Суффиксы ь, w и d определяют шаг инкремента и декре-. мента для индексных регистров esi и edi. Если команда используется в общем формате, то размерность операндов должна быть определена явно.
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 127 >> Следующая