Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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 функции для прорисовки линий, фигур и текста.
<< Назад В начало Далее >> |
|