Команда CMPS
Синтаксис команды
cmps
256 Глава
Цепочечные команды
Здесь:
определяет адрес цепочки-источника в сегменте данных, зара-
нее загружаемый в пару регистров
ESI/SI;
определяет адрес цепочки-приемника, которая должна нахо-
диться в дополнительном сегменте, заранее загружаемый в пару регистров
ES:EDI/DI.
Алгоритм работы команды
заключается в последовательном выполнении
вычитания (элемент цепочки-источника минус элемент цепочки-получателя) над
очередными элементами обеих цепочек. Принцип выполнения вычитания коман-
дой
такой же, как у команды сравнения
Она так же, как и
произво-
дит вычитание элементов, не записывая при этом результата, и устанавливает флаги
ZF, SF и OF. После вычитания очередных элементов цепочек командой CMPS индекс-
ные регистры ESI/SI и EDI/DI автоматически изменяются в соответствии со значе-
нием флага DF на значение, равное размеру элемента сравниваемых цепочек. Чтобы
заставить команду CMPS выполняться несколько раз, то есть произвести последо-
вательное сравнение элементов цепочек, необходимо перед командой CMPS опре-
делить префикс повторения. С командой
можно использовать префиксы
вторения REP, REPE/REPZ или REPNE/REPNZ:
REP — сравнивать элементы цепочек, пока ЕСХ/СХ>0;
II REPE или REPZ — сравнивать элементы цепочек до выполнения
из двух
условий:
содержимое ЕСХ/СХ равно нулю;
в цепочках встретились разные элементы (флаг ZF стал равен нулю);
или REPNZ — сравнивать элементы цепочек до выполнения одного из двух
условий:
П содержимое ЕСХ/СХ равно нулю;
п в цепочках встретились одинаковые элементы (флаг ZF стал равен единице).
Таким образом, выбор подходящего префикса позволяет организовать более
гибкий поиск одинаковых или различающихся элементов цепочек командой
Критерий для выбора префикса — условие выхода из цикла. Для определения кон-
кретного условия наиболее подходящим является способ, использующий коман-
ду условного перехода
Ее работа заключается в анализе содержимого регист-
ра ЕСХ/СХ, и если оно равно нулю, то управление передается на метку, указанную
в качестве операнда
Так как в регистре ЕСХ/СХ содержится счетчик повторе-
ний для цепочечной команды, имеющей любой из префиксов повторения, то, ана-
лизируя ЕСХ/СХ, можно определить условия выхода из цикла цепочечной команды.
Если значение в ЕСХ/СХ не равно нулю, то это означает, что выход произошел по
причине совпадения либо несовпадения очередных элементов цепочек. Существует
возможность еще больше конкретизировать информацию об условии завершения
операции сравнения. Сделать это можно с помощью команд условной передачи
управления (табл. 12.1).
Сравнение цепочек 257
Таблица
Соответствие команд условной передачи управления условиям завершения
команды
Условие завершения сравнения
> операнд_приемник
операнд_источник
<
операнд_приемник
операнд источник
операнд приемник
Соответствующая команда
условного перехода
JA или JG (операнд со знаком)
JE (в том числе для операнда со знаком)
JNE или JNZ (в том числе для операнда
со знаком)
JB или JL (операнд со знаком)
JBE или JLE (операнд со знаком)
JAE или JGE (операнд со знаком)
Как определить местоположение очередных совпавших или несовпавших эле-
ментов в цепочках? Вспомните, что после каждой итерации цепочечная команда
автоматически осуществляет инкремент-декремент значения адреса в соответству-
ющих индексных регистрах. Поэтому после выхода из цикла в этих регистрах бу-
дут находиться адреса элементов, находящихся в цепочке после (!) элементов, по-
служивших причиной выхода из цикла. Для получения истинного адреса этих
элементов необходимо скорректировать содержимое индексных регистров, увели-
чив либо уменьшив значение в них на длину элемента цепочки.
В качестве примера рассмотрим программу из листинга 12.2, в которой сравни-
вается две
находящиеся в одном сегменте. Используется команда CMPS.
Префикс повторения — REPE.
Листинг
Сравнение двух строк командой CMPS
не
строки
;привязка DS и ES к сегменту данных
<12> mov
;загрузка сегментных регистров
<13> mov
<14> mov
;настройка ES на DS
на экран исходных строк stringl и string2
<16> mov
<17> lea
<18> int
<19> lea dx,string2
<20> int 21h
<21>;сброс флага
- сравнение в направлении возрастания адресов
<22>
<23> lea
в si смещения stringl
<24> lea
;загрузка в di смещения string2
<25> mov
строки для префикса
строк (пока сравниваемые элементы строк равны)
продолжение £
<3>STACK
<5>match
<6>failed
<8>string2
small
256
db
db
db
db
0
0
9
256
258 Глава
Цепочечные команды
8>6>5>3>25>24>23>22>21>20>19>18>17>16>14>13>12> Do'stlaringiz bilan baham: |