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

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


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





Чтобы решить ту же задачу средствами Visual С + + .NET, мы должны прежде всего изменить имя процедуры в ассемблерном модуле в соответствии с требованиями компилятора С + + . Напомним, что во всех наших примерах мы используем соглашение stdcaii. Тогда фрагменты кода, где встречается процедура addreals, будут выглядеть следующим образом (листинг 3.36).

I Листинг 3.36. Ассемблерная процедура addreals для использования в программе на С++
.386
.model flat
public _addreals@8
. data
SUM DD 0
. code
_addreals@8 proc
push EBX
push EBP
ret 8
_addreals@8 endp
end

За основу приложения в Visual С + + .NET возьмем диалоговое окно, на котором разместим, как и в Delphi-варианте, три поля редактирования Edit с тремя элементами статического текста static Text и кнопку Button.
В классе окна объявим процедуру addreals как внешнюю с соответствующими параметрами:
extern "С" float* _stdcall addreals(float *xl, float *x2);

Свяжем с элементами управления Edit три вещественные переменные xi, X2 и sumx. Теперь напишем обработчик нажатия кнопки, исходный текст которого приведен в листинге 3.37.
Листинг 3.37. Обработчик события нажатия кнопки в программе на С++ void CAddTwoRealsinCNETDlg::OnBnClickedButtonl()
// TODO: Add your control notification handler code here
UpdateData(TRUE);
sumX = *addreals(&X1, &X2);
UpdateData(FALSE);

Приложение ожидает ввода переменных xi и X2 в поля редактирования.
Функция updateData с параметром TRUE передает текущие значения элементов управления в связанные с ними переменные xi и X2. Процедура addreals получает в качестве параметров адреса этих переменных и возвращает адрес, по которому находится сумма. Оператор " * " позволяет передать в переменную sumx сумму двух вещественных чисел.
Последняя команда UpdateData с параметром FALSE передает текущие значения переменных в связанные с ними элементы управления и обновляет экран.

Наш следующий пример более сложен и показывает, как можно найти максимальный элемент в массиве вещественных чисел. Размерность массива зададим равной 9. Разработаем классическое процедурно-ориентированное приложение в Visual С + + .NET. В таком приложении обычно присутствуют два взаимосвязанных фрагмента кода: главная процедура winMain, регистрирующая класс окна и выполняющая все функции по инициализации экземпляра окна приложения, и функция обратного вызова (оконная процедура). Более подробно мы будем рассматривать разработку таких приложений в главе 4, а сейчас просто используем каркас приложения, построенный для нас Мастером приложений С + + .NET.
Поиск максимального элемента в массиве вещественных чисел выполним в ассемблерной процедуре, исходный текст которой представлен в листинге 3.38.
Листинг 3.38. Ассемблерная процедура, выполняющая поиск максимального элемента в массиве вещественных чисел
.386
.model flat
public _maxreal@8
.data
MAXREAL DD 0
. code
_maxreal@8 proc
push EBX
push
mov
mov
mov
mov
f init
fid
NEXT_CMP:
add
fcom
fstsw
sahf
jne
fid
EBP
EBP,ESP
EBX, DWORD PTR [EBP+12]
EDX, DWORD PTR [EBP+16]
ECX, 1
DWORD PTR [EBX]
EBX, 4
DWORD PTR [EBX]
AX
CHECK_INDEX
DWORD PTR [EBX]
CHECK INDEX:
cmp
je
inc
jmp
FIN:
fwait
fstp
mov
pop
ECX, EDX
FIN
ECX
NEXT CMP
DWORD PTR MAXREAL
EAX, offset MAXREAL
EBP
pop ЕВХ
ret 8
_maxreal@8 endp
end


 
 
 

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