x86汇编中cmove指令的目的?

您所在的位置:网站首页 汇编pushfd x86汇编中cmove指令的目的?

x86汇编中cmove指令的目的?

2023-05-13 23:02| 来源: 网络整理| 查看: 265

拆卸可执行文件时,遇到了cmove指令。 我已经在Internet上进行了搜索,但是我只发现这是有条件的,如果源和目标相等,则会出现mov。 我不明白的是为什么我需要它,因为它不会改变操作数。 目的是什么?

CMOVcc指令不比较源和目标。它使用来自先前比较(或设置标记的其他操作)中的标记,该比较确定是否应该执行移动。

例;如果eax和ebx相等,则会将edx复制到ecx:

12cmp eax, ebx cmoveq ecx, edx

这样做与:

1234cmp eax, ebx jne skip   mov ecx, edx skip: 相关讨论 @Guffa确实可以做同样的事情,但是第一个并不关心分支预测失败。 要点:具有存储器源操作数(如cmoveq eax, [edx])的cmov是无条件加载,用于馈送ALU选择操作。 即使条件为假,也会在错误的地址上出错。 cmov的要点是具有数据依赖性而不是控制依赖性(可能会发生分支错误预测)。

cmov的目的是允许软件(在某些情况下)避免分支。

例如,如果您具有以下代码:

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

..然后,当现代CPU看到jne分支时,将猜测该分支是否将被采用,然后根据该猜测开始推测性地执行指令。如果猜测是错误的,则会导致性能下降,因为CPU必须丢弃任何以推测方式执行的工作,然后开始获取并执行正确的路径。

对于有条件的移动(例如cmove eax,edx),CPU无需猜测将执行哪个代码,从而避免了分支预测错误的代价。但是,CPU无法知道eax中的值是否会更改,这意味着依赖于条件移动结果的后续指令必须等待条件移动完成(而不是通过有条件地执行假定值而不是停转)。

这意味着,如果可以容易地预测分支,则分支可以更快。如果无法轻松预测分支,则条件移动会更快。

请注意,从不严格要求条件移动(始终可以使用分支来完成)-它更像是可选的优化。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3