Поиск заданного элемента в строке

Вид материалаЛабораторная работа

Содержание


Схема команды
Подобный материал:
Лабораторная работа №2

Поиск заданного элемента в строке


Цель работы Целью работы закрепление навыков работы с цепочечными командами SCAS и CMPS.

Задание на лабораторную работу Написать и отладить программу поиска подстроки P в строке S. Исходные данные размещаются в памяти.

Общие теоретические сведения

CMPS – сравнить содержимое двух областей памяти, размером в один байт или в одно слово;

SCAS – сравнить содержимое регистра AL или AX с содержимым памяти.

Схема команды: 

cmps приемник,источник 
cmpsb  cmpsw  cmpsd

Алгоритм работы команды:
  • выполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:
    • адрес источника — в пару регистров ds:esi/si;
    • адрес назначения — в пару регистров es:edi/di;
  • в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:
    • если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;
    • если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности;
  • в зависимости от результата вычитания установить флаги:
    • если очередные элементы цепочек не равны, то cf=1, zf=0;
    • если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;
  • при наличии префикса repe/repne выполнить определяемые им действия.

Схема команды: 

scas приемник 
scasb  scasw  scasd

Алгоритм работы команды:
  • выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;
  • по результату вычитания установить флаги;
  • изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
    • df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;
    • df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу.

masm ;режим работы TASM: ideal или masm

model small ;модель памяти

.data ;сегмент данных

str_1 db '3222322'

a_s1 = $ - str_1

str_2 db '22'

a_s2 = $ - str_2

count db 0

mess db 'seach - $'

.stack ;сегмент стека

db 256 dup ('?') ;сегмент стека

.code ;сегмент кода

assume ds:@data,es:@data

main:

mov ax,@data ;заносим адрес сегмента данных в регистр ax

mov ds,ax ;ax в ds

mov es,ax ;ax в es

;далее текст программы

cld ;сброс флага d

mov cx,a_s1 ;длина строки s1 в cx

mov al,str_2

lea di,str_1

next_s1:lea si,str_2

;сканируем строку s1 в поисках элемента, совпадающего с первым элементом подстроки P

repne scasb

;есть ли такой элемент определяем по состоянию cx и z

;элемента нет – переход на конец программы

. . . .

jmp e_seach

;если элемент найден - проверяем совпадение оставшихся частей строк S и P

. . . .

repe cmpsb

;если все совпадает – увеличиваем счетчик совпадений и возобновляем поиск

inc count ;увеличили счетчик совпадений

. . . .

jmp next_s1

;найден только фрагмент подстроки возобновляем поиск с элемента, следующего за символом строки S, совпавшим с первым символом подстроки P


. . . .

jmp next_s1

e_seach:add count,30h

mov ah,09h ;

mov dx,offset mess ;

int 21h ;вызов прерывания с номером 21h

mov ah,02h ;

mov dl,count ;

int 21h ;вызов прерывания с номером 21h

mov ax,4c00h ;пересылка 4c00h в регистр ax

int 21h ;вызов прерывания с номером 21h

end main ;конец программы с точкой входа main