Команды сравнения

СМР < операнд1>,<операнд2> – Сравнение

Сами операнды не изменяются. Таким образом, если команду сравнения записать в общем виде

сmp операнд_1, операнд_2

то ее действие можно условно изобразить следующим образом:

операнд_1 – операнд_2 -> флаги процессора

В качестве первого операнда команды сmр можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго – регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно, как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Обычно вслед за командой сmр стоит одна из команд условных переходов, анализирующих состояние флагов процессора.

При сравнении чисел без знака необходимо использовать команды условных переходов, предназначенные для анализа чисел без знака (ja, jb и проч.).

При сравнении чисел со знаком необходимо использовать команды условных переходов, предназначенные для анализа чисел со знаком (jl, jg и проч.).

CMPS – Сравнение строк

cmps <имя_строки1>,<имя_строки2>

CMPSB – Сравнение строк по байтам (команда без операндов)

CMPSW – Сравнение строк по словам (команда без операндов)

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они сравнивают по одному элементу каждой строки, фактически осуществляя вычитание второго операнда из первого и устанавливая в соответствии с результатом вычитания флаги CF, PF, AF, ZF, SF и OF. Команда cmpsb выполняет сравнение по байтам, команда cmpsw - по словам, а команда cmps может быть использована для сравнения как байтов, так и слов. В последнем случае размер сравниваемых элементов определяется их описанием (с помощью директив db или dw). Первый операнд адресуется через DS:SI, второй – через ES:DI. Таким образом, операцию сравнения можно условно изобразить следующим образом:

(DS:SI) – (ES:DI) -> флаги процессора

После каждой операции сравнения регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера сравниваемых элементов (байт или слово).

В микропроцессорах семейства I80x86, начиная с процессора I80386 добавлена следующая команда:

CMPSD – Сравнение строк по двойным словам

Команда аналогична командам МП 86 cmpsb и cmpsw, но позволяет сравнивать 32-битовые участки строк, адресуемых через регистры DS:ESI и ES:EDI (или, в 16-разрядных приложениях, через DS:SI и ES:DI). Использование мнемоники cmpsd с префиксом repnе означает, что в качестве счетчика будет автоматически использоваться расширенный регистр ЕСХ.

В микропроцессорах семейства I80x86, начиная с процессора I80486 добавлена следующая команда:

CMPXCHG <операнд1>, <операнд2> – Сравнение и обмен

Команда cmpxchg выполняет в одной операции сравнение и обмен операндов. Команда требует два параметра и неявным образом использует третий операнд - регистр ЕАХ. Первый операнд (приемник) должен находиться в 16- или 32-битовой ячейке памяти, второй операнд (источник) - в регистре общего назначения такого же размера. Команда выполняет сравнение операнда-приемника с содержимым неявного операнда - регистра ЕАХ. Если сравниваемые значения совпадают, операнд-приемник замещается операндом-источником (т.е. содержимое регистра записывается в память). Если сравниваемые значения не совпадают, содержимое памяти (приемник) поступает в регистр ЕАХ. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Рисунок 14 – Схема работы команды CMPXCHG

В микропроцессорах семейства I80x86, начиная с процессора Pentium добавлена следующая команда:

CMPXCHG8B <операнд1> – Сравнение и обмен 8 байтов

Команда cmpxchg8b выполняет в одной операции сравнение и обмен 8-байтовых операндов. Команда требует один параметр и неявным образом использует еще два операнда - пары регистров EDX:EAX и ЕСХ:ЕВХ. В качестве явного операнда команды (приемника) может выступать только 64-битная (8-байтовая) ячейка памяти. Команда выполняет сравнение операнда-приемника в памяти с содержимым EDX:EAX. Если сравниваемые значения совпадают, то операнд-приемник в памяти замещается 64-битным значением ЕСХ:ЕВХ. Если сравниваемые значения не совпадают, содержимое памяти поступает в пару регистров EDX:EAX, замещая один из сравниваемых операндов. Команда воздействует на флаг ZF.

Рисунок 16 –Схема работы команды CMPXCHG8B


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: