【发布时间】:2015-10-24 15:06:30
【问题描述】:
我不要求一个基准。
(如果是这样的话,我会自己做的。)
我的问题:
为了方便,我倾向于避免使用间接/索引寻址模式。
作为替代,我经常使用立即寻址、绝对寻址或寄存器寻址。
代码:
; %esi has the array address. Say we iterate a doubleword (4bytes) array.
; %ecx is the array elements count
(0x98767) myloop:
... ;do whatever with %esi
add $4, %esi
dec %ecx
jnz 0x98767;
在这里,我们有一个序列化的组合(dec 和 jnz),它可以防止正确的乱序执行(依赖)。
有没有办法避免这种情况/破坏dep? (我不是装配专家)。
【问题讨论】:
-
所以让我直截了当地说:您想要一个取决于前一条指令的结果的条件跳转,可以与该指令乱序执行?我认为这在逻辑上是不可能的。
-
另请注意
dec不推荐,因为它会导致部分标志更新停滞。 -
@Jester:那我应该用一个子吗?
-
您可以使用
lea 4(%esi),%esi进行添加,这不会影响标志,因此您可以在更高的位置插入subl $1, %ecx。正如@davmac 所说,除非您使用再次不推荐的loop指令,否则您无法摆脱依赖关系。 -
如果可能,还要确保展开循环,以摊销循环开销的成本。
标签: loops assembly conditional-statements x86-64