(CoMPare String Byte/Word/Double word operands)
Сравнение строк байтов/слов/двойных слов
Схема команды: | cmps приемник,источник cmpsb cmpsw cmpsd |
Назначение: сравнение двух последовательностей (цепочек) элементов в памяти.
Алгоритм работы:
выполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:
адрес источника — в пару регистров ds:esi/si;
адрес назначения — в пару регистров es:edi/di;
в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:
если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;
если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности;
в зависимости от результата вычитания установить флаги:
если очередные элементы цепочек не равны, то cf=1, zf=0;
если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;
при наличии префикса выполнить определяемые им действия (см. команды repe/repne).
Состояние флагов после выполнения команды:
11 | 07 | 06 | 04 | 02 | 00 |
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команды без префиксов осуществляют простое сравнение двух элементов в памяти. Размеры сравниваемых элементов зависят от применяемой команды. Команда cmps может работать с элементами размером в байт, слово, двойное слово. В качестве операндов в команде указываются идентификаторы последовательностей этих элементов в памяти. Реально эти идентификаторы используются лишь для получения типов элементов последовательностей, а их адреса должны быть предварительно загружены в указанные выше пары регистров. Транслятор, обработав команду cmps и выяснив тип операндов, генерирует одну из машинных команд cmpsb, cmpsw или cmpsd. Машинного аналога для команды cmps нет. Для адресации назначения обязательно должен использоваться регистр es, а для адресации источника можно делать замену сегмента с использованием соответствующего префикса.