Команда CMOVcc — Условная пересылка данных (MASM, Real Mode, DOS)

Команды семейства CMOVcc используются для пересылки данных между регистрами при выполнении определённого условия. Условия аналогичны условным переходам Jcc (jump on condition).


Синтаксис:

CMOVcc <приёмник>, <источник>

Где:

  • <приёмник> — регистр общего назначения (должен быть 16 или 32 бита).
  • <источник> — регистр или ячейка памяти (16 или 32 бита).

CMOVcc не поддерживает 8-битные операнды.


Как работает CMOVcc?

  1. Проверяет флаги процессора (CF, ZF, SF, OF и другие).
  2. Если заданное условие выполняется, копирует значение из <источника> в <приёмник>.
  3. Если условие не выполняется, ничего не происходит.

Отличие от Jcc:
CMOVcc не изменяет поток исполнения программы, а просто выполняет или не выполняет копирование.


Условные варианты CMOVcc

ИнструкцияУсловие для копированияАналог JccПроверяемые флаги
CMOVAЕсли выше (> для unsigned)JACF=0 и ZF=0
CMOVBЕсли ниже (< для unsigned)JBCF=1
CMOVE==JEZF=1
CMOVNEЕсли не равно (!=)JNEZF=0
CMOVGЕсли больше (> для signed)JGZF=0 и SF=OF
CMOVLЕсли меньше (< для signed)JLSF≠OF
CMOVCЕсли установлен CFJCCF=1
CMOVNCЕсли CF=0JNCCF=0

Пример кода (MASM, 16-bit DOS)

mov ax, 10       ; AX = 10
mov bx, 20       ; BX = 20
cmp ax, bx       ; Сравниваем AX и BX (устанавливаются флаги)
cmovl ax, bx     ; Если AX < BX (SF ≠ OF), копируем BX в AX

Если AX действительно меньше BX, AX примет значение BX (то есть 20).


Зачем использовать CMOVcc?

  • Позволяет избежать условных переходов Jcc, что уменьшает влияние конвейера процессора.
  • Делает код более компактным и читабельным.
  • Полезен в оптимизированных алгоритмах, например, в компилях и быстрых сравнениях.

Заключение

CMOVcc — мощный инструмент для условных операций, который уменьшает количество переходов в коде и улучшает производительность. Главное — помнить, что он работает только с регистрами и памятью, но не с 8-битными операндами.