Подтвердить что ты не робот

Назначение инструкции cmove в сборке x86?

При разборке исполняемого файла я столкнулся с инструкцией cmove. Я уже искал в Интернете, но я только обнаружил, что оно условное движение, и если источник и место назначение равны mov происходит. Чего я пока не понимаю, так это зачем мне это нужно, так как это не меняет операнды. Какова его цель?

4b9b3361

Ответ 1

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

Пример; это копирует edx в ecx, если eax и ebx равны:

cmp eax, ebx
cmoveq ecx, edx

Это делает то же самое, что:

cmp eax, ebx
jne skip
  mov ecx, edx
skip:

Ответ 2

Цель cmov - позволить программам (в некоторых случаях) избегать веток.

Например, если у вас есть этот код:

    cmp eax,ebx
    jne .l1
    mov eax,edx
.l1:

... затем, когда современный процессор увидит ветку jne он примет догадку о том, будет ли ветка взята или нет, и затем начнет умозрительно выполнять инструкции, основанные на догадке. Если предположение неверно, это приводит к снижению производительности, потому что ЦПУ должен отказаться от любой спекулятивно выполненной работы, а затем начать извлекать и выполнять правильный путь.

Для условного перемещения (например, cmove eax,edx) процессору не нужно угадывать, какой код будет выполнен, и стоимость ошибочно предсказанной ветки исключается. Однако ЦП не может знать, изменится ли значение в eax или нет, что означает, что более поздние инструкции, которые зависят от результатов условного перемещения, должны ждать, пока условное перемещение не завершится (вместо того, чтобы быть умозрительно выполненными с предполагаемым значением) и не глохнет).

Это означает, что если ветвь может быть легко предсказана, ветвь может быть быстрее; и если ветвь не может быть легко предсказана, условие может быть быстрее.

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