我对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 任何澄清都会有所帮助!
答案 0 :(得分:4)
从PPC ISA (PDF Link),bl
是:
bits value
0-5 18
6-29 LI
30 AA (0)
31 LK (1)
设置LK
位表示下一个指令地址应放入链接寄存器。当AA
为0
时,分支目标地址是LI << 2
,符号扩展的总和,以及当前指令的地址。因此,对于您而言,由于您希望跳转到0x14
并且当前位置为0xC
,因此您只想将0x14 - 0xC == 0x8
放入寄存器中。切掉两个底部零(为了说明在运行时执行相反操作的指令)会给你一个编码LI == 0x2
。最后,编码是:
18 LI AA LK
10010 000000000000000000000010 0 1