Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
15.04.2015
Размер:
1.15 Mб
Скачать
    1. Команды сравнения строк

cmps <адрес приемника>, <адрес источника>

cmpsb

cmpsw

cmpsd

Алгоритм работы команды заключается в последовательном выполнении команды вычитания (элемент источника – элемент приемника) элементов цепочек. По результатам вычитания устанавливаются флаги zf. Адрес источника записывается в ds:si, адрес приемника в es:di. В cx указывается количество сравниваемых элементов.

Перед командой сравнения можно использовать префиксы повторения.

REP MOVS – пересылка происходит до тех пор, пока cx<>0

REPE MOVS – пересылка происходит при условии: cx<>0 и zf =1.

Применяется для поиска несовпадающих элементов.

REPNE MOVS – пересылка продолжается пока выполняется условие: cx<>0 и zf=0. Применяется для поиска совпадающих элементов в строках.

Пример.

Сравнить две строки и определить их совпадение

.data

string1 db “1 2 3 4 5 6 7 8 9”

string2 db “1 2 3 4 5 6 7 8 9”

.code

assume ds:data, es:data

main:

mov ax, @data

mov ds, ax

mov es, ax

cld

lea si, string1

lea di, string2

mov cx, 9

repe cmps string1, string2 ;сравнение пока CX<>0 и ZF=1

jcxz m1 ; вывести сообщение о совпадении если CX=0

jne m2 ; вывести сообщение о несовпадении если ZF=0

:

.

m1:

;вывод сообщения о совпадении строк

.

m2:

;вывод сообщения о несовпадении строк

    1. Сканирование строки

Команда производит поиск некоторого значения в области памяти. Искомое значение предварительно должно быть загружено в регистр AL, AX либо в EAX. Выбор регистра должен быть согласован с размером элемента строки, в которой осуществляется поиск.

scas <адрес>

scasb

scasw

scasd

Строка должна располагаться в дополнительном сегменте по адресу ES:DI. В процессе поиска выполняется вычитание из аккумулятора очередного элемента строки и устанавливаются флаги (по результату вычитания). Можно использовать префиксы REPE и REPNE.

Пример:

.data

string db “строка

.code

……….

……..

cld

lea di, string

mov ax, @data

mov es, ax

mov al, ‘a’

mov cx, 6

repne scas string

je mes ; zf=1 вывести сообщение о том, что символ найден

mes:

; вывод на экран сообщения

  1. Загрузка элемента строки в аккумулятор

Команда загружает элемент строки в аккумулятор AL. Эту команду удобно использовать с помощью команд сканирования, сравнения, которые локализуют место искомого компонента строки. Строка должна быть помещена по адресу ES:SI

lods <адрес>

lodsb

lodsw

lodsd

Пример программы, которая сравнивает две строки и первый не совпавший элемент строки помещает в аккумулятор:

.data

string1 db ‘1 2 3 4 5 6,$’

string2 db ‘1 2 3 8 5 6,$’

mes db ‘элементы совпали, $’

.code

assume ds:data, es:data

main:

mov ax,@data

mov ds,ax

mov es,ax

cld

lea di, string1

lea si, string2

mov cx,6

repe cmps string1, string2 ; сравнение пока cx>0 и zf=1

jcxz m

dec si ;в регистре si адрес не совпавшего элемента строки

lods string2 ; (можно lodsb) загрузка байта 8 в аккумулятор

jmp m1

m:

mov dx, offset mes ; загрузить адрес в dx

mov ah, 9h

int 21h ; вывод сообщения «Элементы совпали»

m1:

mov ax, 4c00h

int 21h

end main