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

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


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





Рассмотрим еще один пример, в котором подсчитывается количество слов в строке с завершающим нулем. Предположим, что слова отделяются друг от друга символом пробела. На главной форме приложения разместим два поля редактирования Edit, кнопку Button и две метки статического текста Label. Исходный текст нашего приложения приведен далее в листинге 6.34.
Листинг 6.34. Программа, выполняющая подсчет слов в строке с завершающим нулем
unit cwpas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForml
Buttonl
Editl
Edit2
Labell
Label2
class(TForm)
TButton;
TEdit;
TEdit;
TLabel;
TLabel;
procedure ButtonlClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
si: PChar;
lsl: Integer;
numWords: Integer;
implementation
{$R *.dfm}
function RetNumWords(si:PChar; lsl: Integer): Integer; stdcaii;
asm
push
mov
mov
xor
cmp
je
inc
@cont:
eld
mov
@next:
scasb
jne
cmp
jne
@skip:
loop
jmp
@incEDX:
cmp
je
inc
jmp
EDI
EDI, si
ECX, lsl
EDX, EDX
BYTE PTR [EDI]
@cont
EDX
AL,
@skip
BYTE PTR [EDI], *
@incEDX
@next
@exit
BYTE PTR [EDI], 0
@exit
EDX
@next
@exit:
pop EDI
' mov EAX, EDX
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
si := ' The words of this string will be counted!!'#0;
Editl.Text := si;
lsl := StrLen(sl);
numWords := RetNumWords(si, lsl);
Edit2.Text := IntToStr(numWords);
end;
end.

В этом примере строка с завершающим нулем определена как указатель
PChar. Инициализация строки происходит в теле обработчика нажатия
кнопки. В качестве разделителя слов в этой строке используется пробел.
Автор специально выбрал строку с произвольным расположением слов и
произвольным расположением разделителей для усложнения задачи. Параметрами
процедуры RetNumWords служат адрес строки и ее размер. Возвращаемой
величиной является количество слов в строке. Команды:
mov EDI, si
mov ECX, lsl
xor EDX, EDX

загружают адрес строки в регистр E D I , а размер строки — в регистр ЕСХ. Регистр
EDX используется в качестве счетчика слов и в начале процедуры обнуляется.
Следующий фрагмент кода отрабатывает ситуацию, при которой
пробелы в начале строки (если они есть) будут пропущены и учитываться не
будут:
cmp BYTE PTR [EDI],
je @cont
inc EDX
@cont:
После этого процедура выполняет операцию сравнения текущего символа
строки с символом пробела:
eld
mov AL, ' '
@next:
scasb
jne @skip
cmp BYTE PTR [EDI],
jne @incEDX
@skip:
loop @next


 
 
 

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