有人可以解释PPC分支链接

时间:2013-09-12 17:40:03

标签: assembly powerpc

我对PPC汇编很新,我对编译器如何编码分支链接感兴趣。

示例:

00000000 fnc_1()
00000000 std r1 , 0x7FFFF
00000004 li r2 , 0x0
00000008 mr r3 , r2
*** -> 0000000C bl fnc_2 -> | 10010 | ?? 24bits ?? | 0 | 1 | ****
00000010 blr

00000014 fnc_2()
00000014 ..
00000018 ..
0000001C ..
00000020 blr

所以,我的问题归结为:编译器如何获取偏移量0x14,并将其转换为bl操作码中的24位。我看过十六进制的程序,但仍然无法想象它出。我读过这个:http://www.eecs.umich.edu/eecs/courses/eecs373/GreenBook/ch4-bran.pdf 任何澄清都会有所帮助!

1 个答案:

答案 0 :(得分:4)

从PPC ISA (PDF Link)bl是:

bits    value
0-5     18
6-29    LI
30      AA (0)
31      LK (1)

设置LK位表示下一个指令地址应放入链接寄存器。当AA0时,分支目标地址是LI << 2,符号扩展的总和,以及当前指令的地址。因此,对于您而言,由于您希望跳转到0x14并且当前位置为0xC,因此您只想将0x14 - 0xC == 0x8放入寄存器中。切掉两个底部零(为了说明在运行时执行相反操作的指令)会给你一个编码LI == 0x2。最后,编码是:

  18               LI            AA  LK
 10010 000000000000000000000010  0    1