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

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


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





Если искомый символ в строке найден, в счетчик ЕСХ записывается его порядковый номер, если же последним элементом строки является ноль, т. е. строка закончилась, в ЕСХ записывается о. Если символ не обнаружен и строка еще не закончилась, инкрементируем адрес в регистре ЕВХ, счетчик — в регистре ЕСХ И возвращаемся в начало цикла командой:
jmp next_check
Процедура возвращает значение, как обычно, в регистре ЕАХ И освобождает стек командой ret 8.
Наше приложение на Delphi 7 является более сложным, чем предыдущие примеры. Вначале на главной форме приложения разместим необходимые визуальные компоненты: меню MainMenu, список ListBox, три поля редактирования Edit, три метки Label и кнопку Button. В меню добавим три пункта: Choose Item, Search! И Exit. При выборе пункта меню Choose item из списка ListBox выбирается строка и помещается в поле Editi (метка selected).
Далее при выборе пункта search! символ, помещенный в поле редактирования Edit2 (метка char to search), ищется в выбранной строке. Если символ найден, то в поле редактирования Edit3 (метка Number) отображается его порядковый номер в строке, иначе выдается сообщение "character not found!".
Перейдем к анализу исходного текста Delphi-приложения. В секции implementation объявим ассемблерную процедуру charpos:
implementation
{$R *.dfm}
{$L f:\asm\tasm\charpos.obj}
function charpos(ps: PChar; cl: Char): Integer; stdcaii; external;

В секции объявления переменных укажем массив строк, из которого будут выбираться элементы:
var
Forml: TForml;
sarray: array[1..5] of string[7] = ('First', 'Second', 'Third', 'Fourth', 'Fifth');
Далее напишем обработчики пунктов меню и процедуру инициализации (листинг 3.55).
Листинг 3.55. Обработчики пунктов меню и процедура инициализации на Delphi procedure TForml.FormCreate(Sender: TObject);
var
Index: Integer;
begin
for Index := 1 to 5 do.
begin
ListBoxl.Itemlndex := Index;
ListBoxl.Items.Add(sarray[Index]);
end;
end;
procedure TForml.ChooseltemClick(Sender: TObject);
var
nltem: Integer;
begin
nltem := ListBoxl.Itemlndex;
Editl.Text := ListBoxl.Items[nltem];
end;
procedure TForml.SearchClick(Sender: TObject);
var
ps, psl: PChar;
cl: Char;
num: Integer;
begin
ps := PChar(Edit1.Text);
psl := PChar(Trim(Edit2.Text) ) ;
cl := psl[ 0 ] ;
num := charpos(ps, cl) ;
if num = 0 then
Edit3.Text := 'Character not found!'
else
Edit3.Text := IntToStr(num);
end;
procedure TForml.ExitClick(Sender: TObject);
begin
Close () ;
end;

Разработаем вариант реализации этого примера на языке Visual С + + .NET.
Первое, что необходимо сделать — это изменить имя нашей процедуры в ассемблерном модуле в соответствии с директивой stdcaii.
Исходный текст процедуры будет выглядеть так, как приведено в листинге 3.56.
Листинг 3.56. Ассемблерная процедура поиска символа в строке для работы с программой на С++
.386
.model flat
public _charpos@8
.data
. code
_charpos@8 proc
push EBX
push EBP
mov EBP, ESP
mov EBX, DWORD PTR [EBP+12]
xor EAX, EAX
mov AL, BYTE PTR [EBP+16]
mov ECX, 1
next_check:
cmp AL, [EBX]
je quit
cmp BYTE PTR [EBX], 0
jne inc_cnt
jmp not_found
quit:
mov EAX, ECX
pop EBP
pop EBX
ret 8
inc cnt
inc ECX
inc EBX
:mp next check
not found:
xor ECX, ECX
jmp quit
charpos@8 endp
end


 
 
 

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