反汇编我遇到cmove指令的可执行文件.我已经在互联网上搜索了但是我发现它只是一个有条件的移动,如果源和目的地相等则会发生mov.我还没有理解的是为什么我需要它,因为它不会改变操作数.如果有必要的话,请你用一个例子来解释我的目的
谢谢
Guf*_*ffa 33
该CMOVcc指令不比较的源和目标.它使用先前比较的标志(或设置标志的其他操作)来确定是否应该进行移动.
例; 这复制edx到ecxif eax和ebx是否相等:
cmp eax, ebx
cmoveq ecx, edx
Run Code Online (Sandbox Code Playgroud)
这与以下相同:
cmp eax, ebx
jne skip
mov ecx, edx
skip:
Run Code Online (Sandbox Code Playgroud)
Bre*_*dan 10
的目的cmov是允许软件(在某些情况下)避免分支。
例如,如果您有以下代码:
cmp eax,ebx
jne .l1
mov eax,edx
.l1:
Run Code Online (Sandbox Code Playgroud)
..然后,当现代 CPU 看到jne分支时,它会猜测是否采用该分支,然后根据猜测开始推测性地执行指令。如果猜测错误,则会导致性能损失,因为 CPU 必须放弃任何推测执行的工作,然后开始获取并执行正确的路径。
对于有条件的移动(例如cmove eax,edx),CPU 不需要猜测将执行哪个代码,并且避免了错误预测分支的成本。但是,CPU 无法知道 in 的值是否eax会改变,这意味着后面依赖于条件移动结果的指令必须等到条件移动完成(而不是使用假定值和不拖延)。
这意味着如果可以轻松预测分支,则分支会更快;如果分支不能轻易预测,条件移动会更快。
请注意,从不严格需要有条件的移动(它总是可以用分支来完成)——它更像是一个可选的优化。