Pap*_*bad 0 x86 assembly branch
我在这里查看了最佳答案无条件分支和无条件跳转(MIPS 中的指令)之间有什么区别?
它说分支允许条件,因此指令的格式与无条件的跳转不同。
然而,我见过像 jl 和 je 这样的跳转,它们之前使用 cmp 来设置条件标志,所以在我看来,这些跳转的行为与分支相同,这会减少分支与分支的差异。跳。那么在某些方面我是否可以考虑将 jl 和 je 等指令作为一种分支指令?除了格式之外,我看不出有什么区别,但如果我们考虑执行的话,它似乎并不重要。
我之所以特别问,是因为有人说我需要使用分支,但是,我在 godbolt 中看到的每个算法似乎主要由跳转组成,因此如果不自己编码就不可能获得分支,这不是什么我们已经在这个模块中完成了,所以我没有能力这样做。
“分支”和“跳转”的一般含义以及特定 CPU 架构如何在其指令助记符中使用这些词之间存在差异。您链接的问题特定于 MIPS CPU 架构,因此答案仅解决 MIPS 指令名称中如何使用“分支”和“跳转”。其他 CPU 架构在命名指令时可以不同地使用这些词。
通常,术语“分支”和“跳转”可以互换使用,但是当它们单独使用时,通常分支指令是根据某些测试的结果是否正确来更改程序计数器(PC)的指令。PC 要么设置为指令指定的目标地址,要么保持不变,并正常执行后续指令。跳转指令总是将 PC 设置为目标。换句话说,分支是有条件的,跳转是无条件的。
这种区别反映了这些词的普通英语用法,其中“branch in the road”意味着选择两种不同的选择,而“jump”并不意味着选择。
然而,在很多上下文中,您会看到“分支”或“跳转”没有区别地使用,甚至给出相反的含义,反映了所讨论的特定 CPU 架构如何命名其指令。并非所有 CPU 指令集都按照上面给出的定义来命名其指令。MIPS 指令是一个很好的示例,这就是为什么您链接的问题中的答案使用相同的定义。MIPS 分支指令全部以字母 B 开头,是有条件的,而 MIPS 跳转指令全部以字母 J 开头,是无条件的。
然而,没有任何 ARM 指令的名称中含有“jump”一词。条件分支和无条件跳转指令都被命名为分支,并以字母 B 开头。事实上,普通的“分支”指令在无条件和条件形式中都被称为 B。添加后缀以使 B 指令成为有条件指令而不是无条件指令,但这些相同的后缀可以添加到几乎任何指令中以使其成为有条件指令。
然而,ARM 指令集对此有一个很大的例外。令人困惑的是,由于 ARM 将 PC 寄存器视为通用寄存器,几乎任何指令都可以设置 PC,这意味着 ARM 实际上拥有大量名称中没有“跳转”或“分支”的分支/跳转指令(例如,等等)mov pc, r4 addeq pc, #1234。 )。请注意,现代 ARM 实现限制了 PC 寄存器在少数有意义的情况之外以明确定义的方式使用的方式。
x86指令集则恰恰相反,没有名称中带有“branch”的指令。条件分支和无条件跳转指令都被命名为跳转,并以字母 J 开头。这里的例外是用于实现子程序调用的指令,它们根据其功能在名称中使用“call”或“return”而不是跳转。
其他 CPU 架构可能遵循完全不同的命名约定,例如让“分支”指令使用相对偏移量,而“跳转”指令使用目标的绝对地址。
在很多情况下,人们使用的单词将反映他们使用的 CPU 指令的命名方式。ARM 程序员通常会专门谈论分支,而 x86 程序员会将等效指令描述为跳转。通常需要了解这些词的使用上下文才能消除歧义。例如,对 x86 代码中的分支的引用可能是指使用J cc指令之一的条件分支,而不是 JMP 或 CALL 指令。ARM 代码中的类似引用可以引用任何 ARM“分支”指令(B、BL、BX、BLX、BXJ),无论它们是否有条件,或者是否用于实现子例程调用。
因此,如果有人在谈论分支和跳转,并区分它们,那么他们可能指的是条件分支和无条件跳转。在其他情况下,这两个世界可以互换使用,而不打算区分它们。您需要考虑上下文才能弄清楚其预期含义。当然,在很多情况下,有条件/无条件的区别并不重要。
| 归档时间: |
|
| 查看次数: |
2528 次 |
| 最近记录: |