这些汇编指令
LOOP
、LOOPE
和 LOOPNE
有什么区别?LOOP 减少 ecx 的值并检查 ecx 是否不为零,如果满足该条件,则跳转到指定标签,否则继续执行。
LOOPE 减少 ecx 的值并检查 ecx 不为零 且 ZF 被设置-如果同时满足这些条件,则跳转到标签,否则继续执行。
LOOPNE 与 LOOPE 相同,但要求 ZF 未被设置(即为零)才能进行跳转。
现在是时候看看Google Books 参考书目
编辑:来自链接的简介:LOOPE 和 LOOPNE 本质上是带有一个额外检查的 LOOP 指令。LOOPE 循环“当零标志”,意味着只要零标志 ZF 是 1 并且增量未达到,它将循环,而 LOOPNE 循环“当非零标志”,意味着只要 ZF 是 0 并且增量未达到,它就会继续循环。请记住,这两个指令都不会固有地影响 ZF 的状态。
LOOP指令以及JCXZ/JECXZ指令的速度有点慢;但是,在现代代码中,它们仍然有其用处。
高速并不总是循环中必须要考虑的因素。 例如,如果我们在程序初始化期间只执行一次循环,并且迭代计数较小,则所需的时间将不会被注意到。
另一个例子是调用Windows API函数的循环; 在API调用中花费的时间可能使LOOP执行时间微不足道。同样,这适用于迭代计数较小的情况。
将这些指令视为“工具箱中的另一个工具”; 用正确的工具来完成工作 :)
loop
的uop计数和吞吐量数据,以及一些历史背景,解释了我们陷入了这种进退两难的境地:因为它很慢而没有人使用/因为没有人使用所以不值得让它变快。如果它很快,它通常可以节省代码大小,并且对于adc
循环非常有用(特别是在像 Nehalem 和更早期的 CPU 上存在部分标志暂停的情况下)。 - Peter Cordes