Руководства по набору инструкций Intel, похоже, указывают, что операнд CMOV не читается, если условие не выполняется. (Я подозреваю, что «алгоритм» для инструкции, приведенной в руководстве, не совсем прав.)
По-видимому, другие люди не согласны; см. явное предостережение here:
Если операнд-источник является операндом памяти, он всегда читается независимо от того, выполняется ли условие. Это означает, что любое исключение было бы создано из чтения памяти, будет генерироваться. Если чтение памяти вызвало бы #GP или #PG, то пусть будет так.
Я подозреваю, что аргументация заключается в следующем: декодер команд считывает инструкции, вычисляет эффективные адреса и выдает память как можно раньше, задолго до того, как инструкция будет полностью декодирована и готова к выполнению. Таким образом, чтение в память получает запланированное/выполняемое раньше и вызывает ловушку. Только до тех пор, пока CMOV не будет достигнут исполнительным блоком, что он знает, что чтение памяти не требуется, и запуск его, который в последнее время сделает инструкцию очень медленной, а также усложнит логику предварительной выборки команд.
Я использую его только в своей регистрационной форме, которая не может ловушку.
А? 'cmovne' - это« перемещение, если оно не равно нулю », т. е.« двигаться, если ZF == 0 »; разыменование не происходит, если '% edx' равно 0. –
Просто уточнение терминологии; это «move if not equal» (иначе «cmovnz' -« move if not zero »). – Michael