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

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


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





Листинг 6.48. Обработчик нажатия кнопки, в котором выполняется обработка [строки CString с помощью операторов С++.NET ' :
void CReplacecharinStringDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
LPSTR lps2;
s_Len = strlen((LPCTSTR)si);
s2 - si;
lps2 = s2.GetBuffer (128);
for (int cnt- = 0; cnt < s_Len; cnt++)
{
if (*lps2 == ' ') *lps2 =;
lps2++;
}
UpdateData(FALSE);
s2.ReleaseBuffer;
}

Для доступа к произвольному элементу строки или массива, как известно, необходимо знать адрес этого массива, его размер и тип элементов, входящих в этот массив. Для строк с завершающим нулем адресом строки является адрес первого элемента. Доступ к элементам строки выполняется через индексирование адреса строки.

Чтобы получить доступ к элементам строки cstring, можно воспользоваться функцией GetBuffer, передав ей в качестве параметра размер буфера памяти. В данном случае 128 байт вполне достаточно. Результатом выполнения этой функции является указатель на буфер в памяти, что позволяет работать с отдельными элементами так же, как и в обычных функциях обработки строк. Воспользовавшись парой операторов:
LPSTR lps2;
lps2 = s2.GetBuffer (128) ;

получим адрес буфера строки. Остается определить размер строки. Особых проблем здесь тоже не возникает, достаточно воспользоваться классической функцией striren и сохранить результат в переменной s_Len:
s Len = strlen((LPCTSTR)si);
Далее остается выполнить поиск символов пробела в буфере строки и заменить их символом " + ". Это делается при помощи цикла for. После выполнения всех манипуляций необходимо освободить буфер:
s2.ReleaseBuffer;


Можно оптимизировать предыдущую программу, заменив цикл for компактной ассемблерной процедурой. Исходный текст процедуры на ассемблере (назовем ее repiacechar) приведен в листинге 6.49.
Листинг 6.49. Функция на ассемблере, выполняющая поиск и замену символов в строке типа C S t r i n g
void CReplaceCharinCStringwithBASMDlg::replaceChar(char* psl, int lsl]
{
_asm {
mov
mov
eld
mov
next:
scasb
je
cont:
loop next
jmp
change:
mov
EDI, psl
ECX, lsl
AL, ' '
change
ex
[EDI-1],
jmp cont
ex:
};
}

Процедура принимает в качестве параметров адрес буфера строки и размер
строки. Адрес буфера загружается в регистр E D I , а размер строки в регистр
ЕСХ . Для поиска и замены символов воспользуемся строковой командой
scasb, которая сравнивает содержимое регистра AL (СИМВОЛ пробела) с текущим
элементом строки. Количество итераций определяется размером
строки. Так как после сравнения значение адреса было увеличено на 1, то
если пробел найден, он заменяется на символ " + " с помощью команды:
mov [EDI-1], '+'
Исходный текст обработчика нажатия кнопки с учетом сделанных изменений
приведен в листинге 6.50.
Листинг 6.50. Использование ассемблерной процедуры для поиска и замены символов в строке топа C S t r i n g
void CReplaceCharinCStringwithBASMDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
LPSTR lps2;
length_sl = strlen((LPCTSTR)si);
s2 = si;
lps2 = s2.GetBuffer(128);
replaceChar(lps2, length_sl);
UpdateData(FALSE) ;
s2.ReleaseBuffer;
};

На этом анализ возможностей встроенного ассемблера двух наиболее популярных средств разработки Delphi 7 и Visual С + + .NET можно закончить. По возможности попытаемся охватить ключевые моменты применения ассемблера в приложениях. Главное внимание было уделено технике применения встроенного ассемблера на практике при работе с различными типами данных.

Заключение
Автор попытался дать в книге обширную информацию по применению ассемблера для программирования Windows-приложений. В конце хотелось бы сделать некоторые дополнительные замечания, касающиеся материала книги. Автор постарался охватить как можно более широкий диапазон вопросов по данной теме, хотя некоторые из них остались незатронутыми. Все же можно надеятся, что даже в таком объеме книга принесет пользу читателю.
Так сложилось, что отечественные программисты, пишущие на ассемблере, большую часть своих программ разрабатывают на одном из двух языков: либо макроассемблере MASM фирмы Microsoft, либо на Турбо ассемблере фирмы Borland. Большая часть примеров книги разработана с использованием MASM. Хотелось бы рекомендовать программистам обратить внимание и на другие инструменты разработки на языке ассемблера, например NASM.
На ассемблере можно создавать программы любой сложности, если уметь использовать возможности, предоставляемые операционной системой. Windows, как вы убедились, обладает мощным интерфейсом, созданным специально для программиста и включающим в себя сотни функций WIN API. Успех в создании вашей программы (это касается не только языка ассемблера) во многом зависит от умения использовать этот интерфейс. Из многочисленных примеров видно, что программировать на ассемблере в Windows одновременно и легче, и труднее по сравнению с MS-DOS. Легче потому, что вам не нужно заботиться о правильной инициализации сегментных регистров и выборе моделей памяти. Труднее потому, что архитектура Windows требует от программиста иных подходов, чем традиционная MS-DOS.

Современные средства разработки на ассемблере, такие как MASM 32 или AsmStudio, позволяют создавать приложения на языке ассемблера довольно быстро и качественно. При всех достоинствах этих пакетов разработки следует отметить и один существенный недостаток: ни фирма Microsoft, ни фирма Borland больше не развивают автономные компиляторы ассемблера и прекратили разработки в этом направлении. Альтернативой, причем довольно неплохой, являются продукты сторонних фирм и независимых разработчиков, например тот же NASM. Одной из причин отказа крупных фирм от разработок компиляторов ассемблера является то, что ассемблер стал частью среды программирования в языках высокого уровня.

Встроенный ассемблер языков высокого уровня хоть и не является самостоятельным средством разработки, но весьма эффективен для написания быстрых и производительных программ. Хотелось бы надеяться, что приведенные примеры для Delphi 7 и Visual С + + .NET смогли убедить читателей в необходимости использования ассемблера в своих программах.
Хотелось бы также верить, что эта книга станет настольной для многих программистов — как опытных, так и начинающих.


 
 
 

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