在汇编中,分支有时与跳跃相同吗?

In assembly, is branching sometimes the same as jumping?

我在这里看了最上面的答案What is the difference between unconditional branch and unconditional jump (instructions in MIPS)?

它说分支允许条件,所以指令的格式不同于无条件的跳转。

但是,我已经看到诸如 jl 和 je 之类的跳转,它们之前使用 cmp 来设置条件标志,因此在我看来,这些跳转的行为与分支相同,这将减少差异一个分支的跳跃。那么在某些方面,我可以考虑将诸如 jl 和 je 之类的指令视为一种分支指令吗?除了格式之外,我看不出有什么区别,但如果我们考虑执行,它似乎并不重要。

我特意问一下,因为它已经声明我需要使用分支,但是,我在 Godbolt 中看到的每个算法似乎主要由跳跃组成,所以如果不自己编码似乎不可能获得分支,这不是我们在本模块中所做的事情,所以我没有能力这样做。

"branch" 和 "jump" 的一般含义与特定 CPU 体系结构如何在其指令助记符中使用这些词之间存在差异。您链接的问题特定于 MIPS CPU 体系结构,因此答案仅解决如何在 MIPS 指令名称中使用 "branch" 和 "jump"。其他 CPU 架构在命名指令时可以不同地使用这些词。

"branch"和"jump"

的区别

通常术语 "branch" 和 "jump" 可以互换使用,但是当它们被区别使用时,通常分支指令是根据以下条件更改 program counter (PC) 的指令某些测试的结果是否正确。 PC 要么设置为指令指定的目标地址,要么保持不变,并正常执行后续指令。跳转指令总是简单地将 PC 设置为目的地。换句话说,分支是有条件的,跳转是无条件的。

这种区别反映了单词的普通英语用法,其中 "branch in the road" 表示可以选择两种不同的选项,而跳转则不表示选择。

CPU具体指令命名约定

然而,在很多上下文中,您会看到 "branch" 或 "jump" 没有区别地使用,甚至给出相反的含义,反映了正在讨论的特定 CPU 体系结构如何命名其指示。并非所有 CPU 指令集都按照上面给出的定义命名它们的指令。 MIPS 指令是一个很好的例子,所以这就是为什么你链接的问题的答案使用相同的定义。全部以字母B开头的MIPS分支指令是有条件的,而全部以字母J开头的MIPS跳转指令是无条件的。

然而,没有 ARM 指令的名称中包含单词 "jump"。条件分支和无条件跳转指令都被命名为分支,并以字母 B 开头。实际上,普通的 "branch" 指令在无条件和条件形式下都是 just called B。添加后缀使 B 指令成为有条件的而不是无条件的,但是这些相同的后缀可以添加到几乎任何指令中以使其成为有条件的。

然而,ARM 指令集对此有很大的例外。令人困惑的是,由于 ARM 将 PC 寄存器视为通用寄存器,几乎任何指令都可以设置 PC,这意味着 ARM 实际上有大量 branch/jump 指令,其名称中没有 "jump" 或 "branch" (例如 mov pc, r4 addeq pc, #1234 等)。请注意,现代 ARM 实现限制了 PC 寄存器如何以明确定义的方式使用,除了一小部分有意义的情况。

x86指令集正好相反,没有指令名中带有"branch"的指令。条件分支和无条件跳转指令都被命名为 jumps 并以字母 J 开头。这里的例外是用于实现子程序调用的指令,它们在名称中使用 "call" 或 "return" 取决于它们的功能而不是比跳。

其他 CPU 体系结构可能遵循完全不同的命名约定,例如 "branch" 指令使用相对偏移量,而 "jump" 指令使用绝对地址作为目标。

只有上下文才能消除歧义

在很多情况下,人们使用的词会反映他们使用的 CPU 指令的命名方式。 ARM 程序员通常会专门谈论分支,而 x86 程序员会将等效指令描述为跳转。通常需要了解这些词的使用上下文才能消除它们的歧义。例如,对 x86 代码中分支的引用可能是在谈论使用 Jcc 指令之一的条件分支,而不是 JMP 或 CALL 指令。 ARM 代码中的类似引用可以引用任何 ARM "branch" 指令(B、BL、BX、BLX、BXJ),无论它们是否有条件,或者它们是否用于实现子例程调用。

所以如果有人在谈论分支和跳转,对它们进行区分,那么他们可能指的是条件分支和无条件跳转。在其他情况下,这两个世界可以互换使用,而无意在它们之间做出区分。您将考虑上下文以找出预期的含义。当然,在很多情况下,conditional/unconditional 的区别并不重要。