Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





В этой процедуре используются команды математического сопроцессора.
Как обычно, для извлечения параметров используется регистр ЕВР. По смещению 12 в стеке находится адрес массива вещественных чисел или адрес первого элемента, что одно и то же. Размер массива находится по смещению 16 в стеке. После обработки массива адрес максимального элемента передается, как обычно, в регистре ЕАХ. Текущее значение максимума программа сохраняет в локальной переменной MAXREAL. МЫ не можем передавать ни значение переменной, ни тем более ее адрес сразу в регистре ЕАХ.

Причиной этого является тот факт, что команда математического сопроцессора fstp передает значение из стека сопроцессора только в ячейку памяти.
Поэтому для возвращения результата в вызывающую программу мы используем команды:
fstp DWORD PTR MAXREAL
mov EAX, offset MAXREAL

Наша процедура возвращает адрес переменной MAXREAL, по которому находится максимальный элемент массива. Можно усложнить процедуру и вычислять адрес максимального элемента без использования промежуточной переменной MAXREAL. Читатели могут попробовать разработать такую процедуру самостоятельно в качестве упражнения.

Теперь разработаем программу на С + + .NET, которая будет использовать результат выполнения ассемблерного модуля. Воспользуемся Мастером приложений и разработаем обычное 32-разрядное Windows-приложение.
Исходный текст процедуры winMain и функции обратного вызова представлен в листинге 3.39.
Листинг 3.39. Проф вызывающая ассемблерную процедуру
#include "stdafx.h"
#include "Find Max Value in Array of Reals.h"
#define MAX_LOADSTRING 100 ,
// Глобальные переменные
HINSTANCE hlnst;
TCHAR szTitle[MAX LOADSTRING];
TCHAR szWindowClass[MAX LOADSTRING];
// Объявление функций этого модуля
ATOM
BOOL
MyRegisterClass(HINSTANCE hlnstance);
Initlnstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
extern "C" float* _stdcall maxreal(float *px, int sx);
int APIENTRY _tWinMain(HINSTANCE hlnstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
MSG msg;
HACCEL hAccelTable;
LoadString(hlnstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hlnstance, IDC_FINDMAXVALUEINARRAYOFREALS,
szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hlnstance) ;
// Инициализация приложения
if (!Initlnstance (hlnstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hlnstance,
int nCmdShow)
(LPCTSTR)IDC FINDMAXVALUEINARRAYOFREALS);
// Цикл обработки сообщений
while (GetMessage(&msg, NULL, 0, 0))
Интерфейс с языками высокого уровня 175
{
if (ITranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(Smsg);
}
}
return (int) msg.wParam;

//Функция регистрации класса окна
ATOM MyRegisterClass(HINSTANCE hlnstance)
{
WNDCLASSEX wcex;
wcex.cbSize
wcex.style
wcex.lpfnWndProc
wcex.cbClsExtra
wcex.cbWndExtra
wcex.hlnstance
wcex.hlcon
wcex.hCursor
= sizeof(WNDCLASSEX);
= CS_HREDRAW | CS_VREDRAW;
= (WNDPROC)WndProc;
= 0;
= 0;
= hlnstance;
= Loadlcon(hlnstance,
(LPCTSTR)IDI_FINDMAXVALUEINARRAYOFREALS)
= LoadCursor(NULL, IDC ARROW);
// wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+l);
wcex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wcex.lpszMenuName = (LPCTSTR)IDC_FINDMAXVALUEINARRAYOFREALS;
wcex.IpszClassName = szWindowClass;
wcex.hlconSm = Loadlcon(wcex.hlnstance, . (LPCTSTR)IDI_SMALL)
return RegisterClassEx(Swcex);
BOOL Initlnstance(HINSTANCE hlnstance, int nCmdShow)
HWND hWnd;
hlnst = hlnstance;
hWnd = CreateWindow(szWindowClass, szTitle,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0, NULL, NULL, hlnstance, NULL);
if (IhWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd) ;
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmld, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
char buf[16];
float xarray[9] = {12.43, 93.54, -23.1, 23.59, 16.09,
10.67, -54.7, 11.49, 98".06};
float *xres;
int cnt;
switch (message)
{
case Wl_COMMAN-D:
wmld = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmld)
case im_ABOUT:
DialogBox(hlnst, (LFCTST?}IDD_AbCUT3GZ.
hWnd, {DLGPROC/toout);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Здесь находится код нашего обработчика
TextOut(hdc, 30, 80, "ARRAY: ", 7);
for (cnt = 0; cnt < 9; cnt++)
{
gcvt(xarray[cnt], 6, buf);
TextOut(hdc, 100 + cnt*50, 80, buf, 5);
}
TextOut(hdc, 30, 100, "MAXIMUM: ", 9);
xres = maxreal(xarray, 9);
gcvt(*xres, 5, buf);
TextOut(hdc, 220, 100, (LPCTSTR)buf, 5);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
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 || LOWORD(wParam) = IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru