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