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

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


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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


 
 
 

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