PowerPC指令`bcctr`的目的是什么?

时间:2015-03-05 15:36:05

标签: assembly powerpc

我是PowerPC架构的新手,我正在使用bcctr指令查看一些反汇编代码。虽然本手册指定了bcctr指令的工作原理,但它并没有解释它通常用于什么。你能想出这些用法的例子,并详细说明ctr注册的内容吗?我最好的猜测是它用于间接分支(例如,实现对函数指针或vtable的调用),但“减少ctr寄存器然后分支到ctr”的目的对我来说根本不清楚。寄存器作为计数器和目标地址的双重用途尤其令人困惑。

2 个答案:

答案 0 :(得分:9)

bcctr(及其无条件变体bctr)通常用于分支到函数指针。

Power ISA指令集有两条指令¹可用于转移到寄存器中的地址:blr(转移到链接寄存器)和bctr(转移到计数器寄存器)。使用bctr意味着我们可以保留链接寄存器。

在这种情况下,这里使用ctr寄存器并没有什么特别之处 - 它只是我们分支到的地址。流中先前会有一条mtctr指令,我们将地址加载到ctr寄存器中。

您可能也会看到bctrl使用过:这会将链接寄存器设置为当前地址+4,然后分支到计数器。这允许通过分支返回到链接寄存器来调用(通过函数指针)。

¹:在非特权模式下,至少

答案 1 :(得分:2)

看着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。 分支目标地址是CTR 0:61 || 0b00,在32位模式下将分支目标地址的高32位设置为0。如果LK = 1,则将Branch指令后面的指令的有效地址放入链接寄存器。 如果指定了“减量和测试CTR”选项(BO 2 = 0),则指令表格无效。

来源:Power ISA Version 2.07