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

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

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

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

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

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

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

// PURPOSE: Processes messages for the main window.
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
Глава 15. Оптимизация процедурно-ориентированных приложений..
449
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int wmld, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
RECT rc;
int il, i2, ires;
char buf[32] - "il - i2 -
switch (message)
{
case WM_COMMAND:
wmld = LOWORD(wParam); wmEvent =» HIWORD (wParam) ;
// Parse the menu selections: switch (wmld)
{
case IDM_ABOUT:
DialogBox(hlnst, (LPCTSTR)IDD_ABOUTBOX/ hWnd, (DLGPROC)About); break; i
case IDM_EXIT:
DestroyWindow(hWnd); break; default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break; case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps); break;
450
Часть III. Встроенный ассемблер Visual C++ .NET2003 и его использование
II Added code
case WM_LBUTTONDOWN:
11 = 45;
12 = 98;
hdc = GetDC(hWnd);
GetClientRect(hWnd, &rc);
_asm {
mov EAX, il sub EAX, i2 mov ires, EAX
}
sprintf(&buf[9],"%d", ires);
TextOut(hdc, (rc.right-rc.left)/3, (rc.bottom-rc.top)/2, buf,12); InvalidateRect(hWnd, &rc, FALSE);
ReleaseDC(hWnd, hdc); break; case WM_DESTROY:
PostQuitMessage(0); break; default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK I I LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
Глава 15. Оптимизация процедурно-ориентированных приложений..._____________451
return TRUE.;
}
break;
}
return FALSE;
}
Поскольку мы имеем дело с классическим процедурно-ориентированным приложением Windows, для вывода результата на экран используется обработчик события wm lbuttondown:
case WM_LBUTTONDOWN:
11 - 45;
12 = 98;
hdc = GetDC(hWnd);
GetClientRect(hWnd, &rc);
_asm {
mov EAX, il sub EAX, i2 mov ires, EAX
}
sprintf(&buf[9],"%d", ires);
TextOut(hdc, (rc.right-rc.left)/3, (rc.bottom-rc.top)/2, buf,12); InvalidateRect(hWnd, &rc, FALSE);
ReleaseDC(hWnd, hdc); break;
Программный код обработчика нажатия левой кнопки поместим, например, после обработчика wm paint в функции обратного вызова. Проанализируем этот программный код.
Первые два оператора присваивают переменным (ни i2) какие-либо целочисленные значения. В нашем случае и - 45,12 = 98.
Сами переменные объявлены в функции обратного вызова WndProc. Здесь же объявлены вспомогательные переменные rc, ires и buf.
Для того чтобы отобразить результат вычитания в окне приложения, вначале требуется получить контекст устройства рисования. Это выполняется оператором
hdc = GetDC(hWnd)
Далее получаем координаты клиентской области окна приложения с помощью оператора
GetClientRect(hWnd, &rc)
452_________Часть III. Встроенный ассемблер Visual C++ .NET 2003 и его использование
Эти координаты нам понадобятся при позиционировании и выводе текста на экран.
Блок ассемблерных команд выполняет в этом обработчике основную работу — вычисляет разность двух чисел. Результат помещается в переменную
ires.
Для вывода на экран значение целочисленной переменной ires нужно преобразовать в текстовую строку. Для этого подходит функция sprintf. Функция определена в заголовочном файле stdio.h, поэтому он должен быть включен в исходный текст программы. Функция sprintf имеет вид:
sprintf(&buf[9],"%d", ires)
После преобразования целочисленной переменной ires в строку символов (переменная buf) можно вывести результат в клиентскую область окна. Это выполняется с помощью функции
TextOut(hdc, (rc.right-rc.left)/3, (rc.bottom-rc.top)/2, buf,12)
Наконец, нужно сообщить операционной системе о необходимости перерисовки клиентской области окна приложения. Это выполняет функция
InvalidateRect(hWnd, &rc, FALSE);
Перед выходом из обработчика необходимо освободить контекст устройства:
ReleaseDC(hWnd, hdc);
Применение ассемблерных блоков и команд в процедурно-ориентирован-ном приложении выполняется довольно просто. Для этого нужно поместить программный код в обработчик какого-либо события.. Следует учитывать и тот факт, что для вывода результатов математических вычислений на экран или на принтер необходимо преобразовать их в символьный тип. Функция TextOut и подобные ей оперируют с символьными данными, поэтому и возникает необходимость такого преобразования.
Окно работающего приложения показано на рис. 15.1.
35Щ
Рис. 15.1. Окно процедурно-ориентированного приложения Windows, показывающего результат вычитания двух целых чисел
и 1/УНЧ.Я;! '
Глава 15. Оптимизация процедурно-ориентированных приложений..
453
Язык ассемблера является эффективным средством оптимизации при разработке системных служб (system services) Windows. Системные службы Windows — это наиболее таинственная часть операционной системы и, в то же время, одна из наиболее важных составляющих ОС. Можно кратко определить службу как программу, работающую вне контекста пользователя.
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 127 >> Следующая