Команда CMOVcc — Условная пересылка данных (MASM, Real Mode, DOS)
Команды семейства CMOVcc используются для пересылки данных между регистрами при выполнении определённого условия. Условия аналогичны условным переходам Jcc (jump on condition).
Синтаксис:
CMOVcc <приёмник>, <источник>Где:
<приёмник>— регистр общего назначения (должен быть 16 или 32 бита).<источник>— регистр или ячейка памяти (16 или 32 бита).
CMOVcc не поддерживает 8-битные операнды.
Как работает CMOVcc?
- Проверяет флаги процессора (CF, ZF, SF, OF и другие).
- Если заданное условие выполняется, копирует значение из
<источника>в<приёмник>. - Если условие не выполняется, ничего не происходит.
Отличие от Jcc:
CMOVcc не изменяет поток исполнения программы, а просто выполняет или не выполняет копирование.
Условные варианты CMOVcc
| Инструкция | Условие для копирования | Аналог Jcc | Проверяемые флаги |
|---|---|---|---|
CMOVA | Если выше (> для unsigned) | JA | CF=0 и ZF=0 |
CMOVB | Если ниже (< для unsigned) | JB | CF=1 |
CMOVE | == | JE | ZF=1 |
CMOVNE | Если не равно (!=) | JNE | ZF=0 |
CMOVG | Если больше (> для signed) | JG | ZF=0 и SF=OF |
CMOVL | Если меньше (< для signed) | JL | SF≠OF |
CMOVC | Если установлен CF | JC | CF=1 |
CMOVNC | Если CF=0 | JNC | CF=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-битными операндами.