(CoMPare String Byte/Word/Double word operands)
(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).
(REPeat string operation)
Повторить цепочечную операцию
Схема команды:
| rep repe repz repne repnz
| Назначение: указание условного и безусловного повторения следующей за данной командой цепочечной операции. Алгоритм работы: Алгоритм работы зависит от конкретного префикса. Префиксы rep, repe и repz на самом деле имеют одинаковый код операции, их действия зависят от той цепочечной команды, которую они предваряют:
- rep используется перед следующими цепочечными командами и их краткими эквивалентами: movs, stos, ins, outs. Действия rep:
1. анализ содержимого cx:
§ если cx< > 0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
§ если cx=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2. уменьшить значение cx=cx–1 и вернуться к шагу 1;
- repe и repz используются перед следующими цепочечными командами и их краткими эквивалентами: cmps, scas. Действия repe и repz:
1. анализ содержимого cx и флага zf:
§ если cx< > 0 или zf< > 0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
§ если cx=0 или zf=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2. уменьшить значение cx=cx-1 и вернуться к шагу 1;
- repne и repnz также имеют один код операции и имеют смысл при использовании перед следующими цепочечными командами и их краткими эквивалентами: cmps, scas. Действия repne и repnz:
1. анализ содержимого cx и флага zf:
§ если cx< > 0 или zf=0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
§ если cx=0 или zf< > 0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2. уменьшить значение cx=cx–1 и вернуться к шагу 1.
|