Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Сравнение цепочек






 

Синтаксис команды cmps:

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

Здесь:

адрес_источника определяет цепочку-источник в сегменте данных. Адрес цепочки должен быть заранее загружен в пару ds: esi/si;

адрес_приемника определяет цепочку-приемник. Цепочка должна находиться в дополнительном сегменте, и ее адрес должен быть заранее загру жен в пару es: edi/di.

Алгоритм работы команды cmps заключается в последовательном выполнении вычитания (элемент цепочки-источника — элемент цепочки-получателя) над очередными элементами обеих цепочек. Принцип выполнения вычитания командой cmps аналогичен команде сравнения сmp. Она так же, как и сmp, производит вычитание элементов, не записывая при этом результата, и устанавливает флаги zf, sf и of. После выполнения вычитания очередных элементов цепочек командой cmps индексные регистры esi/si и edi/di автоматически изменяются в соответствии со значением флага df нa значение, равное размеру элемента сравниваемых цепочек. Чтобы заставить команду cmps выполняться несколько раз, то есть производить последовательное сравнение элементов цепочек, необходимо перед командой cmps определить префикс повторения.

С командой cmps можно использовать префиксы повторения repe/repz или repne/repnz:

- rере или repz — если необходимо организовать сравнение до тех пор, пока не будет выполнено одно из двух условий:

достигнут конец цепочки (содержимое есх/сх равно нулю);

в цепочках встретились разные элементы (флаг zf стал равен нулю).

- rерnе или repnz-— если нужно проводить сравнение до тех пор, пока:

не будет достигнут конец цепочки (содержимое есх/сх равно нулю);

в цепочках встретились одинаковые элементы (флаг zf стал равен единице).

Вместе с командой сравнения используется команда условного перехода jcxz. Ее работа заключается в анализе содержимого регистра есх/сх, и если оно равно нулю, то управление передается на метку, указанную в качестве операнда jcxz. Так как в регистре есх/сх содержится счетчик повторений для цепочечной команды, имеющей любой из префиксов повторения, то, анализируя есх/сх, можно определить причину выхода из зацикливания цепочечной команды. Если значение в есх/сх не равно нулю, то это означает, что выход произошел по причине совпадения либо несовпадения очередных элементов цепочек.

Таблица 11.1. Сочетание команд условной передачи управления с результатами команды cmps (для чисел со знаком)

Причина прекращения операции сравнения Команда условного перехода, реализующая

переход по этой причине

операнд_источник > операнд_ириемник jg

операнд_источник = операнд_приемник je

операнд_источник < > операнд_прнемник jne

операнд__источник < операнд__приемник jl

операнд_источннк < = операнд__приемник jle

операнд_источник > = операнд_приемник jge

 

Как определить местоположение очередных совпавших или несовпавших элементов в цепочках? Вспомните, что после каждой итерации цепочечная команда автоматически осуществляет инкремент/декремент значения адреса в соответствующих индексных регистрах. Поэтому после выхода из цикла в этих регистрах будут находиться адреса элементов, находящихся в цепочке после (!) элементов, которые послужили причиной выхода из цикла. Для получения истинного адреса этих элементов необходимо скорректировать содержимое индексных регистров увеличив либо уменьшив значение в них на длину элемента цепочки,

 

Таблица 11.2. Сочетание команд условной передачи управления с результатами команды cmps (для чисел без знака!

Причина прекращения операции сравнения Команда условного перехода, реализующая

переход по этой причине

операнд_источник > операнд_приемннк ja

опсранд__источник = операнд_приемник jc

операнд_источник < > операнд_приемник jnc

операнд__источник < операнд__приемник jb

операнд_источник < = операнд_приемник. jbe

операнд_источкик > = оиеранд_приемник jac

 

В качестве примера рассмотрим программу из листинга 11.2, которая сравнивает две строки, находящиеся в одном сегменте. Используется команда cmps. Префикс повторения — rере.

 

; prg_11_2.asm

MODEL small

STACK 256

.data

match db 0ah, 0dh, 'Строки совпадают.', '$'

failed db 0ah, 0dh, 'Строки не совпадают', '$'

string1 db '0123456789', 0ah, 0dh, '$'; исследуемые строки

string2 db '0123406789', '$'

.code

ASSUME ds: @data, es: @data; привязка DS и ES к сегменту данных

main:

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

mov ds, ax

mov es, ax; настройка ES на DS

; вывод на экран исходных строк string1 и string2

mov ah, 09h

lea dx, string1

int 21h

lea dx, string2

int 21h

; сброс флага DF - сравнение в направлении возрастания адресов

cld

lea si, string1; загрузка в si смещения string1

lea di, string2; загрузка в di смещения string2

mov cx, 10; длина строки для префикса repe

; сравнение строк (пока сравниваемые элементы строк равны)

; выход при обнаружении не совпавшего элемента

; cycl:

repe cmps string1, string2

jcxz equal; cx=0, то есть строки совпадают

jne not_match; если не равны - переход на not_match

equal:; иначе, если совпадают, то

mov ah, 09h; вывод сообщения

lea dx, match

int 21h

jmp exit; выход

not_match:; не совпали

mov ah, 09h

lea dx, failed

int 21h; вывод сообщения

; теперь, чтобы обработать не совпавший элемент в строке, необходимо уменьшить значения регистров si и di

dec si; скорректировали адреса очередных элементов для получения

dec di; адресов несовпавших элементов

; сейчас в ds: si и es: di адреса несовпавших элементов

; здесь вставить код по обработке несовпавшего элемента

; после этого продолжить поиск в строке:

inc si; для просмотра оставшейся части строк необходимо установить указатели на; следующие элементы строк за последними несовпавшими. После этого можно повторить весь; процесс просмотра и обработки несовпавших элементов в оставшихся частях строк.

inc di

; jmp cycl

exit:; выход

mov ax, 4c00h

int 21h

end main; конец программы

 

Если сравниваются цепочки с элементами слов или двойных слов, то корректировать содержимое esi/si и edi/di нужно на 2 и 4 байта, соответственно.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал