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

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


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





Изменим вариант решения задачи для Visual С + + .NET. Наверное, будет полезно увидеть другое исполнение программы с другим интерфейсом. Ассемблерный вариант процедуры (назовем ее maxval) для этого случая (листинг 3.31) будет выглядеть иначе, чем в примере для Delphi.
Листинг 3.31. Ассемблерная процедура maxval, используемая в программе на С++
.386
.model flat
public _maxval@8
.data
MaxVal DD 0
. code
_maxval@8 proc
push ESI
push EBP
mov EBP, ESP
mov ECX, DWORD PTR [EBP+16]
dec ECX
mov ESI, DWORD PTR [EBP+12]
mov EAX, [ESI]
Интерфейс с языками высокого уровня 163
next cmp:
cmp EAX, [ESI+4]
jg go loop
mov EAX, [ESI+4]
go loop:
add ESI, 4
loop next cmp
mov DWORD PTR MaxVal, EAX
mov EAX, offset MaxVal
pop EBP
pop ESI
ret 8
maxval@8 endp
end

Для хранения максимального элемента массива здесь используется переменная Maxval, а результатом выполнения процедуры является адрес этой переменной, который возвращается в вызывающую программу в регистре ЕАХ. Поскольку мы имеем дело с компилятором С + + , то необходимо соответствующим образом определить имя процедуры maxval. В соответствии с соглашением stdcaii она примет вид _maxvai@8. Напомню командную строку для макроассемблера MASM:
ml /с maxval.asm

Основную программу в С + + .NET построим на основе класса диалогового окна, причем не будем использовать в качестве элементов управления ни кнопки, ни поля редактирования. Единственное, что мы сделаем — это разместим на форме приложения два элемента статического текста. Для вывода результатов работы приложения будем использовать клиентскую область окна приложения. При нажатии левой кнопки мыши (событие WM_LBUTTONDOWN) В окне приложения будет отображаться как массив целых чисел, так и максимальный элемент этого массива.

Обработчик события WM_LBUTTONDOWN представлен в листинге 3.32.
Листинг 3.32. Обработчик нажатия левой кнопки мыши в программе на С++ void CFindMaxIntegerinArrayDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int il[10] = {4, 87, 90, -34, 2, -5696, -45, 76, -12, -964};
char buf[8];
CClientDC dc(this);
RECT rect;
GetClientRect(&rect);
for (int cnt = 0; cnt < sizeof(il)/4; cnt++)
{
dc.TextOut((rect.right - rect.left)/30 + cnt*45,
(rect.bottom - rect.top)/4,
itoa(il[cnt], buf, 10));
};
int ires = *maxval(il, sizeof(il)/4) ;
dc.TextOut((rect.right - rect.left)/2 - 40,
(rect.bottom - rect.top)/2 + 30,
itoa(ires, buf,10));
CDialog::OnLButtonDown(nFlags, point);
}

Как обычно, объявим нашу процедуру maxval в разделе деклараций:
extern "С" int* _stdcall maxval(int *pil, int sil);
В качестве параметров она принимает адрес и размер массива, а возвращает адрес, по которому будет помещен максимальный элемент массива.
Программный код обработчика нажатия левой кнопки мыши предназначен для отображения наших данных в клиентской области окна. Для отображения текста или графики в окне приложения необходимо вначале получить контекст устройства отображения. Он представляет собой структуру данных Windows, в которой содержится информация об атрибутах рисования для таких устройств, как дисплей или принтер. Все запросы на вывод графики и текста проходят через объект контекста устройства, который включает в себя все WIN API функции для прорисовки линий, фигур и текста.


 
 
 

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