gpt4 book ai didi

loops - 使用 ecx 和循环指令的 x86 汇编编程循环与 jmp + j<条件>

转载 作者:行者123 更新时间:2023-12-02 08:07:39 27 4
gpt4 key购买 nike

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

最佳答案

当您提到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 次条件跳转,但我们只进行 1 次无条件跳转。虽然节省了一点钱,但可能很重要,特别是因为它处于循环中。

现在你确实提到了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指令的性能进行一些研究。

关于loops - 使用 ecx 和循环指令的 x86 汇编编程循环与 jmp + j<条件>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6805692/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com