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

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

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

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

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

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

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

438
Часть III. Встроенный ассемблер Visual C++ .NET2003 и его использование
Листинг 14.2. Копирование символов с помощью VxrtualAIioc // VA_EXAMPLE.срр : Defines the entry point for the console application.
¦include "stdafx.h"
#include <windows.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
int* src = NULL; int* dst = NULL;
printf(" VirtualAlloc copying with ASM EXAMPLE\n\n"); srand( (unsigned)time( NULL ) );
src = (int*)VirtualAlloc(NULL, 10, MEM_COMMIT, PAGE_READWRITE); int* bsrc » src;
dst = (int*)VirtualAlloc(NULL, 10, MEM_COMMIT, PAGE_READWRITE);
printf("\nsrc : ");
for(int cnt ® 0; cnt < 10;crit++ )
{
*src = rand(); printf("%d ", *src); src++;
)
_asm {
mov ESI, bsrc mov EDI, dst mov ECX, 10 cld
rep movsd
Гпава 14. Ассемблер в задачах системного программирования Windows
439
printf("\n\ndst : ");
for(int cnt = 0; cnt < 10;cnt++ )
{
printf("%d ", *dst); dst++;
}
VirtualFree(bsrc, 0,MEM_RELEASE);
VirtualFree(dst, 0,MEM_RELEASE);
getchar(); return 0;
}
Хочу обратить внимание на оператор
int* bsrc = src
Он необходим для правильной установки адреса массива в указателе bsrc.
Память для хранения десяти элементов массива случайных целых чисел src выделяется с помощью команды
src = (int*)VirtualAlloc(NULL, 10, MEM_COMMIT, PAGE_READWRITE)
Точно так же выделяется память для массива приемника dst:
dst = (int*)VirtualAlloc(NULL, 10, MEM_COMMIT, PAGE_READWRITE)
Копирование выполняется с большой скоростью ассемблерными командами
mov ESI, bsrc mov EDI, dst mov ECX, 10 cld
rep movsd
После использования выделенной памяти необходимо ее освободить. Это выполняется с помощью функций
VirtualFree(bsrc, 0,MEM_RELEASE)
VirtualFree(dst, 0,MEMJRELEASE)
Окно работающего приложения показано на рис. 14.1.
440 Часть III.'Встроенный ассемблер Visual C++ .NET2003 и его использование
Рис. 14.1. Окно приложения, выполняющего копирование целых чисел с помощью функции VirtuaiAiioc
Операционные системы Windows поддерживают еще одну, весьма полезную технологию работы с файлами. Для операций используются файлы, отображаемые на память. Эта технология очень удобна для одновременной обработки файлов несколькими процессами и находит широкое применение. Менеджер виртуальной памяти операционной системы позволяет программе работать с файлом так, как будто он загружен в оперативную память компьютера. Для работы с файлом, отображенным на память, необходимо выполнить следующие шаги:
1. Открыть файл с ПОМОЩЬЮ вызова CreateFile.
2. Передать дескриптор файла функции WIN API CreateFileMapping.
3. Получить указатель на буфер памяти, где находится файл, с помощью функции MapviewOfFile. Этот указатель является обычным, т. е. с ним можно производить различные операции, допустимые для указателей.
4. По завершению работы с файлом необходимо вызвать функцию
UnmapViewOfFile.
5. Удалить дескриптор объекта отображения файла и закрыть дескриптор файла С ПОМОЩЬЮ функции CloseHandle.
Следующий пример демонстрирует применение отображения файла на память. В зависимости от значения опции выбора (1 или 0) выполняется преобразование алфавитных символов текстового файла testmap к верхнему или нижнему регистру. Эти преобразования выполняются, как и в предыдущем листинге, с использованием встроенного ассемблера, что обеспечивает хорошую производительность. Исходный текст приложения показан в листинге 14.3.
Гпава 14. Ассемблер в задачах системного программирования Windows
441
: Листинг 14 3. Преобразование файла, отоЪрзигеыого на память,
// FILE_MAPPING_EXAMPLE.cpp : Defines the entry point for the console // application.
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE fin;
HANDLE map_fin; char* mapBase = NULL; int fSize; int choice = 0;
printf<" USING FILE MAPPING WITH ASM OPTIMIZING\n\n");
printf("Enter 1 - convert to upper, 0 -convert to lower:"); , scanf("%d", fichoice);
fin = CreateFile("d:Wtestmap", GENERIC_WRITEIGENERIC_READ,
0, NULL, OPEN_EXISTING,
0, NULL); if (fin == INVALID_HANDLE_VALUE)
{
printf("Cannot open file\n"); exit(1);
}
fSize = GetFileSize(fin, NULL);
map_fin = CreateFileMapping(fin, NULL,
PAGE_READWRITE, 0,
0, NULL);
if (!map_fin)
{
printf("Cannot open mapping\n");
442_________Часть III. Встроенный ассемблер Visual C++ .NET2003 и его использование
getchar(); exit(2);
}
mapBase = (char*)MapViewOfFile(map_fin,
FILE_MAP_WRITE, 0, 0, 0);
if (!mapBase)
{
printf("Cannot get the map pointer\n"); getchar (); exit (1);
}
char* dmapBase = mapBase; switch(choice){ case 1:
_asm {
mov ECX, fSize mov EDI, dmapBase
next_char:
mov AL, BYTE PTR [EDI] cmp AL, 96 jg high_check jmp next
high_check:
cmp AL, 122 jg next sub AL, 32
mov BYTE PTR [EDI], AL
next:
add EDI,1 dec ECX jnz next_char }
break; case 0:
asm {
Гпава 14. Ассемблер в задачах системного программирования Windows
443
mov ЕСХ, fSize mov EDI, dmapBase
nextl_char:
mov AL, BYTE PTR [EDI] cmp AL, 64 jg highl_check jmp nextl highl_check:
cmp AL, 90 j g next add AL, 32
Предыдущая << 1 .. 110 111 112 113 114 115 < 116 > 117 118 119 120 121 122 .. 127 >> Следующая