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





В качестве шаблона для С++ приложения выберем диалоговое окно.
Разместим на главной форме приложения три поля редактирования Edit, три элемента static Text и кнопку Button. Свяжем с полями редактирования Source И Character переменные src И cSrc Т И П Э CString, а с полем редактирования Number — переменную iPos целочисленного типа.
Напишем обработчик события для нажатия кнопки Button (листинг 3.57).
Листинг 3.57. Обработчик нажатия кнопки в приложении на С++
void GetNumberOfCharinStringforCNETDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
CString si;
CString cl;
char *pcl;
UpdateData(TRUE);
si = src;
cl = cSrc;
pel = cl.GetBuffer(8);
iPos = charpos(si.GetBuffer(16), *pcl);
UpdateData(FALSE);

В случае если символ найден, то в поле редактирования Number будет выведен номер элемента, иначе выводится 0.

3.4. Сравнительный анализ программного кода на ассемблере и С++
Эффективность применения процедур на ассемблере можно проиллюстрировать на последнем примере. В качестве тестового приложения выберем простую программу копирования одной строки в другую. Для начала напишем программу на "чистом" Visual С + + .NET. Создадим приложение на основе диалогового окна. Разместим два поля редатирования Edit (source и Dest) и кнопку Button. Назовем кнопку Copy strings with С++ .NET. Поставим в соответствие элементам Edit переменные cSrc и cDst типа cstring. Обработчик нажатия кнопки выполнит копирование одной строки в другую при помощи операторов языка С + + (листинг 3.58).
Листинг 3.58. Копирование одной строки в другую с помощью операторов С++ в обработчике нажатия кнопки
void CCOPYSTRINGCNETDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
char src[25] = "NET VARIANT FOR COPYING!";
char dst[25];
int srcLen = sizeof(src);
for (int cnt = 0; cnt < srcLen; cnt++)
dst[cnt] = src[cnt];
cSrc = (CString)src;
cDst = (CString)dst;
UpdateData(FALSE);
}

Добавим еще одну кнопку на главную форму приложения и назовем ее с о р у strings with ASM PROC. Для обработчика нажатия этой кнопки разработаем и откомпилируем ассемблерную процедуру (назовем ее copystr)
(листинг 3.59).
Листинг 3.59. Копирование одной строки в другую с использованием ассемблерной процедуры
.386
.model flat
public _copystr@12
. data
. code
_copystr@12 proc
push ESI
push EDI
push EBP
mov EBP, ESP
mov ESI, DWORD PTR [EBP+20]
mov EDI, DWORD PTR [EBP+16]
mov ECX, DWORD PTR [EBP+24]
eld
rep movsb
pop EBP
pop EDI
pop ESI
ret 12
_copystr@12 endp
end

Используем эту процедуру для копирования строк. В качестве параметров процедура принимает адрес исходной строки ЕВР+20, адрес строки назначения ЕВР+16 и размер строки ЕВР+24. Копирование выполняется при помощи команды movsb с префиксом повторения, равным размеру исходной строки. Сам обработчик нажатия кнопки copy strings with ASM PROC представлен в листинге 3.60.
Листинг 3.60. Обработчик нажатия кнопки Copy s t r i n g s w i t h ASM PROC в программе на С++
void CCOPYSTRINGCNETDlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
char src[25] = "ASM VARIANT FOR COPYING!";
char dst[25];
int srcLen = sizeof(src);
copystr(dst, src, srcLen);
cSrc = (CString)src;
cDst = (CString)dst;
UpdateData(FALSE);

Кроме того, объявим нашу внешнюю ассемблерную процедуру в разделе деклараций:
extern "С" _stdcall copystr(char *dst, char *src, int len);

Добавим объектный модуль copystr в проект. После компиляции и сборки программы запустим ее на выполнение. При нажатии кнопки строки скопируются при помощи программного кода, разработанного средствами языка С + + , и мы увидим результат в окне приложения
га Ш C O P Y S T R I N G С + + . N E T
Source j t J E l VAR I AM T FOB СОРПМГИ
D«t [nT'iT^RIahT FOP, COFViHQi
j" Copy Strings w#h С++ NET
C o p y Strings with ASM PROC


 
 
 

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