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

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

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

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

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

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

Магда Ю.С. Использование ассемблера для оптимизации программ на С++ — БХВ-Петербург , 2004. — 496 c.
ISBN 5-94157-414-2
Скачать (прямая ссылка): ispolzovaniyaassemblera2004.djvu
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 127 >> Следующая

DWORD ul_reason_for_call,
LPVOID IpReserved )
{
return TRUE;
}
extern "C" float ____declspec(dllexport) sub2f(float fl, float f2)
{
return(fmax(fl, f2)-min(fl,f2));
Гпава 7. Компоновка ассемблерных модулей с программами на C++ .NET
241
Для корректной работы среди файлов проекта должна находиться и стандартная библиотека minimax. lib, ссылки на функции которой определены как
extern "С" float fmax(float fl, float f2)
extern "C" float fmin(float fl, float f2)
Кроме этого, сама функция sub2f должна быть объявлена как внешняя с
атрибутом dliexport. После компиляции проекта получим библиотеку DLL и библиотеку импорта. Свяжем с проектом DLL еше один, в котором будет продемонстрировано использование стандартной библиотеки minimax. lib и DLL. Исходный текст приложения представлен в листинге 7.23.
Листинг 7.23. Программный код приложение, использующие гн;?,е^о/пгр';; Функции стандартной оиолиотеки и DLL :
// USE_MINIMAX_LIB_IN_DLL.cpp : Defines the entry point for the console // application.
#include "stdafx.h"
extern "C" ___declspec(dllimport) float sub2f(float fl, float ?2);
extern "C" float fmax(float fl, float f2); extern "C" float fmin(float fl, float f2);
int _tmain(int argc, _TCHAR* argv[])
{
float fl, f2;
printf(" USING DLL WITH STANDARD LIB DEMO\n\n");
printf("Enter float fl:");
scanf("%f", &fl);
printf("Enter float f2:");
scanf("%f", &f2);
printf("\nMAX = %.2f\n", fmax(fl, f2)); printf("\nMIN - %.2f\n", fmin(fl, f2) ); printf("\nMAX-MIN= %.2f\n", sub2f(fl, f2) ) ; getchar(); return 0;
}
Поскольку в приложении используются функции fmin и fmax, определенные в другом модуле, ТО необходимо ВКЛЮЧИТЬ библиотеку minimax. lib в состав приложения. •
242
Часть II. Интерфейс с языками высокого уровня
Окно работающего приложения показано на рис. 7.19
ЯШ"————
Рис. 7.19. Окно приложения, демонстрирующего применение стандартной библиотеки и DLL
Рассмотрим еще один пример использования отдельно скомпилированного ассемблерного модуля в составе DLL. Пусть наша DLL (назовем ее C0MM0N_DLL.dll) содержит функцию absfdll, вычисляющую абсолютное значение произвольного вещественного числа. В свою очередь, absfdll использует для вычисления ассемблерную функцию absf.
Результат вычисления абсолютного значения числа отображается на экране консольным приложением C++. Основное приложение для вызова absf из DLL использует динамическую загрузку и обращение к функции посредством вызова WIN API LoadLibrary И GetProcAddress.
Теперь перейдем к более детальному рассмотрению примера. Начнем с библиотеки динамической компоновки C0MM0N_DLL.dll. Ее исходный текст представлен в листинге 7.24.
Л ист Инг' 7.24. текст Йиолисл они ::с Ш-L. И'.^ют.^укмжч: j
// COMMON_DLL.срр : Defines the entry point for the DLL application.
#include "stdafx.h"
extern "C" float absf(float fl);
BOOL APIENTRY DllMain( HANDLE hModule,
• DWORD ul reason for call,
Гпава 7. Компоновка ассемблерных модулей с программами на C++ .NET_________243
LPVOID IpReserved
)
{
return TRUE;
}
extern "C" ___declspec(dllexport) float absfdll(float fl)
{
return (absf(fl));
}
Поскольку функция absf находится в другом модуле, она должна быть объявлена с директивой extern. Функция absfdll, экспортируемая из DLL, использует absf в операторе возврата return. Хочу заметить, что такой вариант использования ассемблерной функции (через оператор return) позволяет применять ассемблер для работы с управляемым кодом C++ .NET, что, в общем случае, сделать довольно сложно.
Исходный текст ассемблерной функции absf не вызывает затруднений для анализа и представлен в листинге 7.25.
Листинг Т..25. Ассемблерная функция absf ;------------------absf. asm----------------
.686
.model flat, С . code
absf proc push EBP mov EBP, ESP finit
fid DWORD PTR [EBP+8]
fabs
fwait
pop EBP
ret
absf endp end
244
Часть II. Интерфейс с языками высокого уровня
Основное приложение, как было уже сказано, использует метод динамической загрузки функции.absf из библиотеки и не требует предварительного объявления импортируемых из DLL функций с директивой extern. Кроме того, не требуется включать файл библиотеки импорта, как в предыдущем примере, в проект основного приложения. Исходный текст консольного приложения на C++ .NET приведен в листинге 7.26.
Листинг 7.26. Использосаиие DLL. содер.'кзщси функцию ab;?r-dl i; ^||| // This is the main project file for VC++ application project // generated using an Application Wizard.
#include "stdafx.h"
#include <windows.h>
int _tmain()
{
// TODO: Please replace the sample code below with your own.
typedef FLOAT (*myfunc) (FLOAT); myfunc absfdll;
printf(" USE EXTERNAL OBJ IN DLL (DYNAMIC LOADING)\n\n");
HINSTANCE hLib = LoadLibrary("COMMON_DLL"); if (hLib == NULL)
{
printf("Unable to load library\n"); getchar(); exit (1);
}
absfdll = (myfunc)GetProcAddress(hLib, "absfdll"); if (!absfdll)
{
printf("Unable to load functions!\n");
FreeLibrary(hLib);
Гпава 7. Компоновка ассемблерных модулей с программами на C++ .NET
245
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 127 >> Следующая