PowerPC 指令“bcctr”的目的是什么?
What is the purpose of the PowerPC instruction `bcctr`?
我是 PowerPC 体系结构的新手,我正在查看一些使用 bcctr
指令的反汇编代码。尽管手册详细说明了 bcctr
指令的工作原理,但并未解释它通常的用途。您能否举出此类用途的示例,并详细说明 ctr
寄存器的作用?我最好的猜测是它用于间接分支(例如实现对函数指针或 vtables 的调用),但 "decrement ctr register and then branch to ctr" 的目的对我来说根本不清楚。寄存器作为计数器和目标地址的双重用途尤其令人困惑。
查看 POWER ISA,我看到:
bcctr = 条件分支到计数寄存器
用法:
bcctr B0, BI, BH
算法:
cond_ok <- BO_0 | (CR_{BI+32} ≡ BO 1 )
if cond_ok then NIA <- {iea} CTR_{0:61} || 0b00
if LK then LR <- {iea} CIA + 4
BI+32 指定要测试的条件寄存器位。
BO 字段用于按照描述解析分支
在图 44 中。BH 字段的使用如中所述
图 46。
分支目标地址为CTR0:61 || 0b00,32位模式下分支目标地址的高32位设置为0。如果 LK=1,则分支指令之后的指令的有效地址被放入 Link 寄存器。
如果指定了“递减并测试CTR”选项(BO 2 =0),则指令形式无效。
bcctr
(及其无条件变体,bctr
)通常用于函数指针的分支。
Power ISA 指令集有两条指令¹,可用于跳转到寄存器中的地址:blr
(跳转到 link 寄存器)和 bctr
(跳转到计数器登记)。使用 bctr
意味着我们可以保留 link 寄存器。
在这种情况下,在这里使用 ctr 寄存器没有什么特别的——它只是我们分支到的地址。在流的前面会有一个 mtctr
指令,我们将地址加载到 ctr 寄存器中。
您可能会看到 bctrl
也被使用:这会将 link 寄存器设置为当前地址 + 4,然后分支到计数器。这允许通过返回 link 寄存器来调用(通过函数指针)return。
¹:在非特权模式下,至少
我是 PowerPC 体系结构的新手,我正在查看一些使用 bcctr
指令的反汇编代码。尽管手册详细说明了 bcctr
指令的工作原理,但并未解释它通常的用途。您能否举出此类用途的示例,并详细说明 ctr
寄存器的作用?我最好的猜测是它用于间接分支(例如实现对函数指针或 vtables 的调用),但 "decrement ctr register and then branch to ctr" 的目的对我来说根本不清楚。寄存器作为计数器和目标地址的双重用途尤其令人困惑。
查看 POWER ISA,我看到:
bcctr = 条件分支到计数寄存器
用法: bcctr B0, BI, BH
算法:
cond_ok <- BO_0 | (CR_{BI+32} ≡ BO 1 )
if cond_ok then NIA <- {iea} CTR_{0:61} || 0b00
if LK then LR <- {iea} CIA + 4
BI+32 指定要测试的条件寄存器位。 BO 字段用于按照描述解析分支 在图 44 中。BH 字段的使用如中所述 图 46。 分支目标地址为CTR0:61 || 0b00,32位模式下分支目标地址的高32位设置为0。如果 LK=1,则分支指令之后的指令的有效地址被放入 Link 寄存器。 如果指定了“递减并测试CTR”选项(BO 2 =0),则指令形式无效。
bcctr
(及其无条件变体,bctr
)通常用于函数指针的分支。
Power ISA 指令集有两条指令¹,可用于跳转到寄存器中的地址:blr
(跳转到 link 寄存器)和 bctr
(跳转到计数器登记)。使用 bctr
意味着我们可以保留 link 寄存器。
在这种情况下,在这里使用 ctr 寄存器没有什么特别的——它只是我们分支到的地址。在流的前面会有一个 mtctr
指令,我们将地址加载到 ctr 寄存器中。
您可能会看到 bctrl
也被使用:这会将 link 寄存器设置为当前地址 + 4,然后分支到计数器。这允许通过返回 link 寄存器来调用(通过函数指针)return。
¹:在非特权模式下,至少