x86汇编中cmove指令的目的? |
您所在的位置:网站首页 › 汇编pushfd › x86汇编中cmove指令的目的? |
拆卸可执行文件时,遇到了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 |