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

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


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





Для вывода текста строки в окно приложения мы используем контекст устройства и связанную с ним функцию TextOut. Процедуре rets в качестве параметра передается адрес строки P I . Строка типа pchar может быть представлена в виде массива символов, поэтому запись rets ( PI ) является корректной.
Теперь разработаем вариант основной программы для компиляции в Visual С++ .NET. Вначале внесем некоторые изменения в исходный текст ассемблерного модуля из предыдущего примера. Изменения касаются в основном имени процедуры. С учетом сделанных изменений программный код приведен в листинге 3.45.

Листинг 3.45. Ассемблерная процедура, выполняющая копирование строки в буфер памяти основной программы на С++
. 3 8 6
.model flat
public _rets@4
.data
TESTSTR DB "TEST STRING FROM ASM PROC !",0
LENSTR EQU $-TESTSTR
.code
_rets@4 proc
push ESI
push EDI
push EBP
mov EBP, ESP
eld
mov ECX, LENSTR
mov ESI, offset TESTSTR
mov EDI, DWORD PTR [EBP+16]
rep movsb
pop EBP
pop EDI
pop ESI
ret 4
_rets@4 endp
end

Наша процедура скопирует строку TESTSTR В область памяти, адрес которой передается из вызывающей программы в качестве параметра. Здесь используется команда movsb, которая скопирует LENSTR число байт из строки TESTSTR, заданной своим смещением в регистре E S I , В строку, заданную смещением в регистре E D I .
Для разработки основной программы воспользуемся Мастером приложений Visual Studio .NET. Выберем диалоговый тип приложения. Разместим на главной форме приложения кнопку Button. Чтобы вывести результирующую строку в окно приложения, воспользуемся обработчиком нажатия кнопки Button. Непосредственный вывод строки выполняет функция TextOut.

Для отображения строки воспользуемся контекстом устройства отображения.
Но вначале определим этот объект в обработчике нажатия кнопки:
CClientDC dc(this);

Структура RECT определяет, как и в приложении на Delphi, координаты клиентской области окна приложения. Чтобы получить текущие координаты, воспользуемся функцией GetciientRect (&rect). Кроме того, необходимо получить саму строку из ассемблерной процедуры и поместить ее в буфер buf. Это действие выполнит оператор rets (buf).
Полностью исходный текст обработчика нажатия кнопки приведен в листинге 3.46.
Листинг 3.46. Обработчик нажания кнопки в приложении на С++
void CRetunStringFromProcDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
char buf[32];
rets(buf);
CClientDC dc(this);
RECT rect;
GetciientRect(&rect);
dc.TextOut((rect.right - rect.left)/5,
(rect.bottom - rect.top)/ 2,
buf) ;
}


 
 
 

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