2

我对 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 任何澄清都会有所帮助!

4

1 回答 1

4

来自 PPC ISA (PDF 链接)bl是:

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

被设置的LK位表示下一条指令地址应该被放入链接寄存器。当AA0时,分支目标地址为LI << 2,符号扩展,与当前指令的地址之和。所以对你来说,既然你想跳转到0x14并且当前位置是0xC,你只想放入0x14 - 0xC == 0x8寄存器。砍掉两个底部的零(以说明在运行时执行相反操作的指令)为您留下一个 encoding LI == 0x2。所以最后,编码是:

  18               LI            AA  LK
 10010 000000000000000000000010  0    1     
于 2013-09-12T18:00:24.307 回答