Как прокомментировал вопрос Джестер, семейство команд cmov*
- это условные перемещения, соединенные через регистр flags с предыдущей операцией (сравнения).
Вы можете использовать, например, документацию Intel в качестве справочного материала для набора команд x86-64 / AMD64. Инструкции условного перемещения приведены на стр. 172 объединенного тома.
cmovb
, cmovnae
и cmovc
все работают одинаково: если установлен флаг переноса, они перемещают исходный операнд в целевой операнд. В противном случае они ничего не делают.
Если мы затем посмотрим на предыдущие инструкции, которые влияют на флаги, то увидим, что инструкция cmp
(суффикс l
является частью синтаксиса AT & T и означает, что аргументы являются "длинными"), изменяет набор флаги в зависимости от разницы между двумя аргументами. В частности, если второе меньше первого (в синтаксисе AT & T), устанавливается флаг переноса, в противном случае флаг переноса сбрасывается; как если бы вычитание было выполнено без сохранения результата где-либо. (Инструкция cmp
влияет и на другие флаги, но они игнорируются кодом.)