Поиск заданного элемента в строке
Вид материала | Лабораторная работа |
СодержаниеСхема команды |
- 1 Задать функции формы для треугольного элемента, заданного координатами своих вершин, 20.79kb.
- Лекция третья. Химические, 49.98kb.
- План Разбор описания Алгоритма "точное предписание о порядке выполнения действий,, 521.58kb.
- Задачи занятия: Сформировать навыки поиска поиск минимума и максимума; Закрепить навыки, 68.67kb.
- Поиск решений Мощным средством анализа данных Excel, 49.82kb.
- Поиск в Интернет (индексный), 171.95kb.
- Для заданного полупроводникового диода, 92.07kb.
- Требования к представлению докладов доклады, не соответствующие данным требованиям,, 99.29kb.
- Запуск Microsoft PowerPoint, 333.39kb.
- Лекция №2 Основные функции культуры, 510.76kb.
Лабораторная работа №2
Поиск заданного элемента в строке
Цель работы Целью работы закрепление навыков работы с цепочечными командами SCAS и CMPS.
Задание на лабораторную работу Написать и отладить программу поиска подстроки P в строке S. Исходные данные размещаются в памяти.
Общие теоретические сведения
CMPS – сравнить содержимое двух областей памяти, размером в один байт или в одно слово;
SCAS – сравнить содержимое регистра AL или AX с содержимым памяти.
Схема команды: | cmps приемник,источник cmpsb cmpsw cmpsd |
Алгоритм работы команды:
- выполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:
- адрес источника — в пару регистров ds:esi/si;
- адрес назначения — в пару регистров es:edi/di;
- адрес источника — в пару регистров ds:esi/si;
- в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:
- если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;
- если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности;
- если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;
- в зависимости от результата вычитания установить флаги:
- если очередные элементы цепочек не равны, то cf=1, zf=0;
- если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;
- если очередные элементы цепочек не равны, то cf=1, zf=0;
- при наличии префикса repe/repne выполнить определяемые им действия.
Схема команды: | scas приемник scasb scasw scasd |
Алгоритм работы команды:
- выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;
- по результату вычитания установить флаги;
- изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
- df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;
- df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу.
- df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;
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