При разборке исполняемого файла я столкнулся с инструкцией cmove
. Я уже искал в Интернете, но я только обнаружил, что оно условное движение, и если источник и место назначение равны mov
происходит. Чего я пока не понимаю, так это зачем мне это нужно, так как это не меняет операнды. Какова его цель?
Назначение инструкции cmove в сборке x86?
Ответ 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
или нет, что означает, что более поздние инструкции, которые зависят от результатов условного перемещения, должны ждать, пока условное перемещение не завершится (вместо того, чтобы быть умозрительно выполненными с предполагаемым значением) и не глохнет).
Это означает, что если ветвь может быть легко предсказана, ветвь может быть быстрее; и если ветвь не может быть легко предсказана, условие может быть быстрее.
Обратите внимание, что условное перемещение никогда не требуется строго (вместо этого оно всегда может быть выполнено с помощью ветки) - это больше похоже на необязательную оптимизацию.