Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Во многих случаях требуется обрабатывать строку из Delphi-приложения. Покажем,
как это можно сделать при помощи процедуры на ассемблере. Результат
возвращается основной программе в виде строки или подстроки. В следующем
примере показано, как это сделать. Как и в предыдущей программе,
обработку строки будет выполнять процедура на ассемблере, которую мы назовем
strpartd. Исходный текст процедуры strpartd приведен в листинге 3.49.
Листинг 3.49. Ассемблерная процедура, выполняющая обработку строки, находящейся в основной программе
.386
.model flat
public strpartd
.data
.code
strpartd proc
push EBP
mov EBP, ESP
mov ECX, DWORD PTR [EBP+12]
mov EAX, DWORD PTR [EBP+8]
add EAX, ECX
pop EBP
ret 8
strpartd endp
end
Небольшой комментарий к исходному тексту. При вызове процедуры
strpartd смещение от начала строки передается первым параметром по
значению. Внутри самой процедуры смещение запоминается в регистре
ЕСХ. Вторым параметром является адрес строки из основной программы,
который мы запоминаем в ЕАХ. Процедура возвращает адрес элемента,
следующего за первыми п элементами символьного массива, в регистре
ЕАХ. В данном случае начало подстроки будет находиться по адресу, определяемому
суммой содержимого регистров ЕАХ И ЕСХ. Поскольку мы используем
соглашение stdcaii, процедура сама восстанавливает стек командой
ret 8.
Исходный текст программы на Delphi приведен в листинге 3.50.
Листинг 3.50. Программа на Delphi, выполняющая отображение подстроки при
помощи ассемблерной процедуры
var
Forml: TForml;
SI: array [1..16] of Char = 1 SOURCE STRING!!'#0;
SlOffset: Integer;
implementation
{$R *.dfm}
{$L STRPARTD.OBJ}
function strpartd(psl: PChar; II: Integer): PChar; stdcaii; external;
procedure TForml.FormCreate(Sender: TObj ect);
begin
SlOffset := 0;
Edit1.Text := SI;
Edit2.Text := strpartd(@S1, SlOffset);
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
SlOffset := UpDownl.Position;
Edit2.Text := strpartd(@S1, SlOffset);
end;
Как видно из листинга основной программы, переменная si представляет
собой строку с завершающим нулем, причем при определении размера такой
строки необходимо учитывать и нулевой символ. Оператор:
Edit2.Text := strpartd(@S1, SlOffset);
присваивает свойству Text поля редактирования Edit2 адрес подстроки, которая
отображается на экране.
Хочется напомнить некоторые очень важные детали, касающиеся работы со
строковыми переменными. Манипуляции со строками и символьными массивами
очень часто встречаются в программистской практике.
К сожалению, в документации фирмы Borland работа со строками описана
плохо. В программах на Delphi во многих случаях требуется обрабатывать
строки стандартного типа — строки с завершающим нулем. В нашей программе
мы также используем строку такого типа. Обратите внимание на ее
объявление:
SI: array [1..16] of Char = 'SOURCE STRING!!'#0;
Для манипуляций с такой строкой из внешних процедур требуется использование
указателей типа pchar. Объявление строки si как массива символов
с завершающим нулем как раз и обеспечивает такую возможность. При
этом переменная-указатель типа pchar содержит адрес первого элемента
строки, т. е. si [1].
Необходимо помнить, что компилятор Delphi не производит проверку диапазона
изменения индекса, поэтому, например, элемент si [ 2 ] — это следующий
элемент массива, а элемент s i [ 0 ] — предыдущий. Полная длина
строки должна учитывать наличие нулевого символа в конце строки # 0 .
Здесь необходимо быть очень внимательным.
Dert Slung {OTRiNGI!
Чтобы отобразить такую строку в поле редактирования Editl, нужно просто
выполнить оператор:
Editl.Text := SI;
Посмотрим, как будет выглядеть эта же программа, возвращающая часть
строки, на С + + .NET. Необходимо сделать некоторые изменения в исходном
тексте ассемблерной процедуры. Они связаны с изменением имени в
соответствии с требованиями компилятора Visual С++ для директивы
stdcaii ( Л И С Т И Н Г 3.51).
Листинг 3.51. Ассемблерная процедура, возвращающая подстроку
в программу на С++
.386
.model flat
public _strpart@8
. data
. code
_strpart@8 proc
push EBP
mov EBP, ESP
mov ECX, DWORD PTR [EBP+12]
mov EAX, DWORD PTR [EBP+8]
add EAX, ECX
pop EBP
ret 8
_strpart@8 endp
end
<< Назад В начало Далее >> |
|