x86汇编编程循环使用ecx和循环指令而不是jmp + j <condition> </condition>

时间:2011-07-24 08:13:47

标签: loops assembly x86

我目前正在学习x86汇编语言,并想知道实现循环的更好方法是什么。一种方法是将值移动到ecx寄存器并使用循环指令,另一种方法是使用jmp指令,然后循环体,然后条件跳转最终到循环体的开头。我想第一个会有更好的可读性,但除此之外,我不知道为什么要使用它。

1 个答案:

答案 0 :(得分:12)

当你提到jmp + body + test时,我相信你在谈论高级语言中while循环的翻译。第二种方法是有原因的。我们来看看。

考虑

x = N
while (x != 0) {
    BODY
    x--
}

天真的方式是

    mov ecx, N      ; store var x in ecx register
top:
    cmp ecx, 0      ; test at top of loop
    je bottom       ; loop exit when while condition false
    BODY
    dec ecx
    jmp top
bottom:

这有N次条件跳跃和N次无条件跳跃。

第二种方式是:

    mov ecx, N 
    jmp bottom
top:
    BODY
    dec ecx
bottom:
    cmp ecx, 0
    jne top

现在我们仍然进行N次条件跳转,但我们只进行一次无条件跳转。一点点节省,但它可能很重要,特别是因为它处于循环中。

现在你确实提到了基本上是

loop指令
dec ecx
cmp ecx, 0
je somewhere

你会怎么做?可能是这样的:

    mov ecx, N
    cmp ecx, 0       ; Must guard against N==0
    je bottom
top:
    BODY
    loop top         ; built-in dec, test, and jump if not zero
bottom:

这是CISC处理器的典型解决方案。它比上面的第二种方式更快吗?这在很大程度上取决于架构。如果您真的想了解更多信息,我建议您对IA-32和Intel 64处理器架构中loop指令的性能进行一些研究。