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

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


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





Буфер принимающей строки buf должен иметь достаточный размер, чтобы в нем могла разместиться передаваемая строка.

При сборке приложения в Visual С + + .NET не забудьте включить объектный модуль на ассемблере в состав проекта. В исходный текст программы после директив include необходимо включить объявление внешней процедуры:
extern "С" _stdcall rets(char *psl);

Очень часто возникает необходимость передавать в основную программу не целую строку, а лишь ее часть (подстроку), начиная с определенной позиции. Следующий пример приложения показывает; как это можно сделать.
Пусть в ассемблерном модуле находится строка символов, и необходимо передать в вызывающую программу подстроку, начиная с определенной позиции. В этом случае процедура должна получать в качестве параметра величину начального смещения от начала строки. Она должна возвращать в основную программу адрес первого элемента выделенной подстроки.
Исходный текст процедуры на ассемблере (назовем ее strpart) приведен в листинге 3.47.
Листинг 3.47. Ассемблерная процедура, возвращающая адрес подстроки
.386
.model flat
public strpart
.data
TESTSTR DB "Parti Part2 Part3 Part4 Part5", 0
.code
strpart proc
push EBP
mov EBP, ESP
mov ECX, DWORD PTR [EBP+8]
mov EAX, offset TESTSTR
add EAX, ECX
pop EBP
ret 4
strpart endp
end

Эта процедура в качестве единственного параметра принимает смещение от начала строки. Строка TESTSTR СОСТОИТ ИЗ 5 подстрок "Parti", ... , "Parts" размером 6 байт каждая (с учетом символа пробела между подстроками).
Величина смещения находится в регистре ЕВР ПО смещению 8 и загружается в регистр ЕСХ с помощью команды:
mov ЕСХ, DWORD PTR [ЕВР+8]

В регистр ЕАХ заносится адрес строки из области данных:
mov ЕАХ, offset TESTSTR
Адрес первого элемента подстроки вычисляется путем суммирования содержимого регистров ЕАХ и ЕСХ.

Разработаем приложение на Delphi, которое выводило бы на экран исходную строку, подстроку и величину смещения относительно начала исходной строки. Для этого разместим на главной форме приложения три поля редактирования Edit, три метки Label, управляющие стрелки upDown и кнопку Button.
ДЛЯ большей НагЛЯДНОСТИ СВОЙСТВУ Increment КОМПОНента UpDown присвоим значение 6 (размер подстроки в строке TESTSTR равен 6Jбайтам). Привяжем свойство Position управляющих стрелок upDown к величине, заданной В поле редактирования Edit3 При ПОМОЩИ СВОЙСТВа Associate.
Свойство Min стрелок upDown установим равным о, а свойство Мах — 30.
Полный текст программы приведен в листинге 3.48.
Листинг 3.48. Полный текст программы на Delphi, выводящей на экран подстроку
var
Forml: TForml;
StrOFFSET: Integer;
StrASM: PChar;
implementation
{$R *.dfm}
{$L STRPART.OBJ}
function strpart(II: Integer): PChar; stdcaii; external;
procedure TForml.ButtonlClick(Sender: TObject);
begin
StrOFFSET := 0;
StrASM := strpart(StrOFFSET);
Edit3.Text := StrASM;
StrOFFSET := UpDownl.Position;
StrASM := strpart(StrOFFSET);
Edit2.Text := StrASM;
end;
end.


 
 
 

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