LOOP, LOOPE, LOOPNE?

10
这些汇编指令 LOOPLOOPELOOPNE 有什么区别?

2
不要使用这些指令,它们在现代CPU上非常慢。相反,手动进行分支。 - alex strange
1
@Alex Strange:你有任何证据来支持你的陈述吗?谢谢。 - Timotei
1
@Timotei Dolean:请参阅http://agner.org/optimize/中的指令表。讨论微码(希望有一些)的CPU教材将解释其原因。 - alex strange
@alexstrange: 相关:**为什么循环指令很慢?英特尔不能高效实现吗?**,其中列出了各种最近微架构上loop的uop计数和吞吐量数据,以及一些历史背景,解释了我们陷入了这种进退两难的境地:因为它很慢而没有人使用/因为没有人使用所以不值得让它变快。如果它很快,它通常可以节省代码大小,并且对于adc循环非常有用(特别是在像 Nehalem 和更早期的 CPU 上存在部分标志暂停的情况下)。 - Peter Cordes
4个回答

21

LOOP 减少 ecx 的值并检查 ecx 是否不为零,如果满足该条件,则跳转到指定标签,否则继续执行。

LOOPE 减少 ecx 的值并检查 ecx 不为零 ZF 被设置-如果同时满足这些条件,则跳转到标签,否则继续执行。

LOOPNE 与 LOOPE 相同,但要求 ZF 未被设置(即为零)才能进行跳转。


9
我想指出的是,所有的LOOP指令都比DEC ECX/JNZ指令组合要慢得多。这是有意为之的,因为现在LOOP指令只应用于用于硬件驱动程序等延迟校准循环中。 - Nils Pipenbrinck
1
@NilsPipenbrinck:在哪些处理器上速度较慢?你的信息来源是什么? - Janus Troelsen
2
@JanusTroelsen,从80486开始它变慢了。在最新的处理器上,它要慢得多。来源:http://www.agner.org/optimize/手册#2。 - Johan
@sharptooth,说到LOOPE,减量后ECX如何可能非零且ZF被设置?LOOPE不会影响ZF标志吗? - golem
回答自己的问题。在使用gdb进行检查后,我可以确认当LOOP(LOOP,LOOPE,LOOPNE)指令减少ECX计数器时,它们都不会影响ZF标志。现在这很有意义。 - golem

5

现在是时候看看Google Books 参考书目

编辑:来自链接的简介:LOOPE 和 LOOPNE 本质上是带有一个额外检查的 LOOP 指令。LOOPE 循环“当零标志”,意味着只要零标志 ZF 是 1 并且增量未达到,它将循环,而 LOOPNE 循环“当非零标志”,意味着只要 ZF 是 0 并且增量未达到,它就会继续循环。请记住,这两个指令都不会固有地影响 ZF 的状态。


2
我认为最好不仅提供链接,而且应该引用源中相关的材料,以防链接失效。 - Thomas Owens

1

LOOP指令以及JCXZ/JECXZ指令的速度有点慢;但是,在现代代码中,它们仍然有其用处。

高速并不总是循环中必须要考虑的因素。 例如,如果我们在程序初始化期间只执行一次循环,并且迭代计数较小,则所需的时间将不会被注意到。

另一个例子是调用Windows API函数的循环; 在API调用中花费的时间可能使LOOP执行时间微不足道。同样,这适用于迭代计数较小的情况。

将这些指令视为“工具箱中的另一个工具”; 用正确的工具来完成工作 :)


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接