Справочник по языку Ассемблера IBM PC



Команда cmps


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


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


Здесь:

адрес_источника определяет цепочку-источник

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

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

Алгоритм работы команды cmps заключается в последовательном выполнении вычитания (элемент цепочки-источника — элемент цепочки-получателя)

над очередными элементами обеих цепочек.


Принцип выполнения вычитания командой cmps аналогичен команде сравнения cmp. Она, так же, как и cmp, производит вычитание элементов, не записывая при этом результата, и устанавливает флаги zf, sf и of.


После выполнения вычитания очередных элементов цепочек командой cmps, индексные регистры esi/si и edi/di автоматически изменяются в соответствии со значением флага df на значение, равное размеру элемента сравниваемых цепочек.


Чтобы заставить команду cmps выполняться несколько раз, то есть производить последовательное сравнение элементов цепочек, необходимо перед командой cmps определить префикс повторения.


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

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

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

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

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

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

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

Таким образом, выбрав подходящий префикс, удобно использовать команду cmps для поиска одинаковых или различающихся элементов цепочек.


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




Содержание  Назад  Вперед