Сборник по задачам и примерам Assembler




Прямой поиск в текстовой строке - часть 2


р db "ень"

1_еп_Р=$-р

db " - " Count (Jb 0."$" :счетчик вхождений Р a S

.code

eld

movcx.len_s

lea di ,s

moval ,p ;P[0]->al next_search:

lea si,p

incsi ;на следующий символ repne scasb

jcxz exit push ex

mov cx.len_p-l repe empsb

jz eq_substr :строка p <> подстроке в s

mov bx.len_p-l

sub bx.cx pop ex

subcx.bx ;учли пройденное при сравнении empsb

jmp next_search eq_substr:

;далее можно выйти, если поиск однократный, но мы упорные, поэтому продолжаем... рорех

sub сх.1еп_р-1 ;учли пройденное при сравнении empsb

inc count

jmp next_search exit: add count,30h :вывод сообщения mes на экран

Из программы видно, что когда размер строки фиксирован, то проблема конца строки решается просто. Но чаще приходится иметь дело с задачами, выполняющими поиск подстроки в строке, длина которой заранее не известна. Это характерно, в частности, для приложений обработки файлов. Но и с файлами не так все просто. Для текстовых ASCII-файлов особых проблем нет — в них строки заканчиваются символами Odh, Oah. Сложнее дело обстоит с обработкой двоичных файлов, где с равной степенью вероятности могут встретиться любые символы кодовой таблицы. В подобных случаях проблему локализации места в файле, где осуществляется поиск, нужно решать исходя из постановки конкретной задачи. Несмотря на это, сами приемы поиска не сильно отличаются от рассмотренных в этом разделе.

В случае когда поиск осуществляется в строке или в массиве строк в памяти, длина которых заранее не известна, то для обозначения их окончаний нужно ввести некоторый служебный символ. Например, в языке Паскаль существует понятие строки ASCII-Z, представляющей собой обычную символьную строку с завершающим нулевым символом. По этому символу и определяется конец строки. Подобные служебные символы можно использовать и для обработки строк

¦ в памяти. Другая возможность задания границы строки — введение в структуру строки специального байта, обычно первого, содержащего длину этой строки.




Содержание  Назад  Вперед