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

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

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

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

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

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

Магда Ю.С. Использование ассемблера для оптимизации программ на С++ — БХВ-Петербург , 2004. — 496 c.
ISBN 5-94157-414-2
Скачать (прямая ссылка): ispolzovaniyaassemblera2004.djvu
Предыдущая << 1 .. 109 110 111 112 113 114 < 115 > 116 117 118 119 120 121 .. 127 >> Следующая

Некоторые вопросы оптимизации задач с помощью ассемблера (многопотоковое программирование, таймеры и системные службы) рассматриваются в других главах этой книги. Здесь будут представлены варианты оптимизации для файловых операций и операций управления памятью. Эти операции оказывают решающее влияние на производительность большинства приложений, поэтому повышению эффективности их выполнения и посвящается материал этой главы.
Начнем с файловых операций. Копирование, перемещение, поиск и удаление файлов и каталогов можно выполнять как с использованием библиотечных функций C++ .NET, так и с помощью функций интерфейса WIN API операционной системы. Производительность выполнения во многом зави-
Глава 14. Ассемблер в задачах системного программирования Windows
435
сит от алгоритма реализации файловых операций. Рассмотрим операцию копирования файлов.
На производительность этой операции файлов существенное влияние оказывает размер буфера памяти для считывания/записи, способ организации хранимых данных в памяти, количество пересылаемых или копируемых байт.
Очень часто при копировании одного файла в другой требуется преобразование данных. Программная реализация такого преобразования оказывает существенное влияние на производительность программы. Встроенный ассемблер позволяет выполнить эффективное преобразование данных с минимальной потерей производительности. Кроме того, ассемблер позволяет написать специфичные алгоритмы обработки и преобразования, которые в C++ реализовать сложно, используя* только библиотечные функции. •
Рассмотрим следующий пример. Пусть в исходном текстовом файле необходимо заменить символы пробела символами плюс и сохранить копию файла под другим именем. Предположим, что в качестве файла-источника используется текстовый файл с именем readfile, а в качестве файла-приемника — writefiie. Замену символов выполним с помощью блока ассемблерных команд. Исходный текст консольного приложения приведен в листинге 14.1.
Листинг 14.1. Копирование файпов с заменой сямвопов
// COPY_F_C_ASM.срр : Defines the entry point for the console // application.
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argvf])
{
FILE *fin, *fout; char buf[256]; int bRead, bWritten;
if ( (fin = fopen( "d:Wreadfile", "r" )) == NULL )
{
printf( "The file 'readf' was not opened\n" ); exit(1);
}
// Open for* write
436
Часть ///. Встроенный ассемблер Visual C++ .NET2003 и его использование
if ( (fout = fopen( "d: Wwritefile", "w+" )) == NULL )
{
printf( "The file 'writefile' was not opened\n" ); exit(1);
}
while ((bRead = fread(buf, sizeof(char), sizeof(buf), fin)) > 0)
{
_asm {
mov ECX, bRead lea ESI, buf mov AL, ' ' next_ch:
cmp BYTE PTR [ESI], AL j e repl inc ESI dec ECX jnz next_ch jmp ex repl:
mov [ESI], '+' inc ESI dec ECX j nz next_ch
ex:
};
bWritten = fwrite(buf, sizeof(char), bRead, fout);
};
fclose(fin); fclose.(fout); return 0;
}
Ассемблерный блок выполняет преобразование очень просто. В регистр esi загружается адрес буфера памяти, где находятся считанные данные. Регистр есх содержит количество байт, которое необходимо обработать. Заменяемый символ, т. е. пробел, находится в регистре al. В каждой итерации выполняется сравнение символов в памяти и регистре al. Если символы равны, то
Гпава 14. Ассемблер в задачах системного программирования Windows
437
на место пробела в буфере памяти записывается символ плюс, и выполняется переход к следующей итерации. Адрес элемента в буфере памяти инкрементируется, а счетчик символов — декрементируется:
cmp BYTE PTR [ESI], AL
je repl
inc ESI
dec ECX
jnz next_ch
В случае неравенства символов выполняется переход к следующей итерации одновременно с инкрементом адреса в регистре esi.
Содержимое буфера памяти после преобразования сохраняется в новом файле с дескриптором fout:
bWritten = fwrite(buf, sizeof(char), bRead, fout)
С помощью ассемблера можно создавать весьма замысловатые и сложные алгоритмы обработки данных из файлов, и возможности здесь неограниченные.
Ни одно приложение не обходится без манипуляций с памятью. Язык C++ содержит функцию maiioc и оператор new. В большинстве случаев программисты обходятся этими средствами. Однако некоторые задачи требуют более гибкого контроля над использованием памяти. В этом случае очень удобной оказывается функция прикладного интерфейса WIN API virtuaiAiioc.
Эта функция очень широко применяется и по сравнению с библиотечной функцией maiioc обладает целым рядом серьезных преимуществ.
В отличие от maiioc, функция virtuaiAiioc позволяет выделить участок памяти, выровненный по границе страницы, которому можно присвоить атрибуты доступа (только чтение, чтение/запись, разрешение выполнения программного кода и т. д.). Это позволяет приложению выполнять обработку данных с максимальной скоростью и наиболее подходящим образом. Кроме этого, функция virtuaiAiioc может резервировать память без ее физического выделения, что снижает нагрузку на операционную систему в целом.
Наш второй пример связан с использованием функции распределения памяти virtuaiAiioc в операциях копирования. Само копирование выполняется в блоке ассемблерных команд, причем используются команды строковых примитивов с префиксом повторения гер. Это позволяет выполнить операцию максимально быстро. Исходный текст программы, в которой используются преимущества как функции virtuaiAiioc, так и ассемблерных команд строковых примитивов, показан в листинге 14.2.
Предыдущая << 1 .. 109 110 111 112 113 114 < 115 > 116 117 118 119 120 121 .. 127 >> Следующая