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