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

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

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

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

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

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

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

430
Часть III. Встроенный ассемблер Visual C++ .NET2003 и его использование
Можно упростить программу предыдущего примера (см. листинг 13.6), если функцию ожидания WaitForSingleObject исключить и вместо нее применить функцию тайм-аута, которую можно указать в четвертом параметре функции setWaitabieTimer. Пятым параметром можно указать адрес структуры или переменной, используемой этой функцией (этот параметр является опциональным). Функцию тайм-аута назовем findmax. В этой функции будет выполняться поиск максимума с помощью блока ассемблерных команд. Параметром этой функции будет целочисленная переменная (назовем ее cnt), представляющая собой счетчик итераций.
Для демонстрации этого варианта программы вычисления максимума будем считать, что выполняется 5 вычислений (cnt=5) с интервалом 0.5 секунды (как и в предыдущем примере).
Исходный текст программы показан в листинге 13.7.
Листинг 13.7. Модифицированный вариант программы вычисления максимума с п а м с i ц ь ю ф у и к ц и и т а й м -а у та в т а й м е р г о ж и д а н и я
// WTIMER_CALC_MAX_VAR_2.срр : Defines the entry point for the console // application.
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
int il[10]; int imax; int Cnt;
void findmax(void)
{
int cnt; if (Cnt!= 0)
{
printf("\n\nil: ");
for(cnt = 0; cnt < 10;cnt++ )
Гпава 13. Встроенный ассемблер C++ .NET и функции времени Windows
431
{
il[cnt] = rand(); printf("%6d ", ilfcnt]);
}
_asm {
lea ESI, il mov ECX, 10
mov EAX, DWORD PTR [ESI] sub ESI, 4 next:
add ESI, 4 cmp EAX, [ESI+4] j1 change dec ECX jnz next jmp ex change:
xchg EAX, [ESI+4] dec ECX jnz next ex:
mov imax, EAX
} ;
printf("\nimax: %6d\n", imax);
Cnt—;
}
else
{
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);
};
}
int _tmain(int argc, _TCHAR* argv[])
{
// Seed the random-number generator with current time so that // the numbers will be different every time we run.
432
Часть III. Встроенный ассемблер Visual C++ .NET 2003 и его использование
srand( (unsigned)time( NULL ) );
Cnt = 5;
// Display 5 numbers.
liDueTime.QuadPart=-100000000 ;
// Create a waitable timer.
hTimer = CreateWaitableTimer(NULL, FALSE, "WaitableTimer"); if (!hTimer)
{
printf("CreateWaitableTimer failed (%d)\n", GetLastError()); exit(1);
}
printf("WAITABLE TIMER IN CALCULATION MAXIMUM INT (VAR 2)\n\n"); printf("Waiting for 10 seconds...\n");
// Set a timer to wait for 10 seconds.
if (!SetWaitableTimer(hTimer, &liDueTime, 500,
(PTIMERAPCROUTINE)findmax, &Cnt, TRUE))
{
printf("SetWaitableTimer failed (%d)\n", GetLastError()); exit(1);
}
while (Cnt != 0)
SleepEx(INFINITE, TRUE); return 0;
Проведем короткий анализ листинга. Функция findmax указана в качестве ОДНОГО ИЗ параметров при вызове функции SetWaitableTimer:
SetWaitableTimer(hTimer, &liDueTime, 500,
(PTIMERAPCROUTINE)findmax, &Cnt, TRUE)
Еще один параметр указывает на адрес счетчика cnt, определяющего количество итераций при вычислении максимума. Сама функция findmax выполняет вычисления в блоке ассемблерных команд. Кроме того, выполняет-
Глава 13. Встроенный ассемблер C++ .NET и функции времени Windows
433
ся декремент счетчика итераций cnt, и, в случае равенства его 0, таймер ожидания деактивируется.
В исходном тексте программы появилась функция WIN API sieepEx(infinite, true). Эта функция переводит в состояние ожидания текущий процесс для того, чтобы функция тайм-аута findmax могла выполниться. После такого объяснения легко понять, как работает цикл
while (Cnt != 0)
SieepEx(INFINITE, TRUE)
В остальном исходный текст программы понятен и не нуждается в объяснениях.
Окно работающего приложения показано на рис. 13.7.
Рис. 13.7. Окно приложения, демонстрирующего работу модифицированного варианта программы вычисления максимума с использованием функции тайм-аута
Рассмотренные в этой главе принципы применения встроенного ассемблера для выполнения зависящих от времени вычислений не исчерпываются приведенными примерами. Эти примеры, надеюсь, помогут читателю освоить и более сложные варианты применения ассемблера для работы в реальном времени.
Глава 14
Ассемблер в задачах системного программирования Windows
В этой главе рассматриваются некоторые вопросы оптимизации задач системного программирования в операционных системах Windows. Системное программирование — весьма сложная область, требующая от разработчика хороших знаний функционирования операционной системы. Улучшение показателей работающих программ возможно в том случае, если четко представлять себе возможности операционной системы по оптимизации программного обеспечения.
В системном программировании решаются задачи по управлению файловой системой, памятью и процессами, межпроцессными коммуникациями, сетевыми соединениями и другие с использованием интерфейса прикладного программного обеспечения, а именно с помощью функций WIN API 32-разрядных операционных систем Windows. Материал главы демонстрирует некоторые аспекты оптимизации подобных задач с помощью языка низкого уровня — ассемблера. Традиционные преимущества ассемблера — компактность и скорость выполнения программного кода — могут быть полезны и при решении задач системного программирования.
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 127 >> Следующая