我正在使用mips,我希望您能帮助我了解有关计算分支地址的一些信息。 修理我,如果我错了..在机器代码 ..地址实际上是字+ pc + 4的数字,pc + 4认为是下一条指令。 但是在mips中我们只会看到我们需要到达标签的地址索引中的单词数量?
答案 0 :(得分:0)
由于有大量可用的工具链可以生成正确/正常工作的机器代码,只需花几秒钟就可以创建一个示例:
00001000 <_ftext>:
...
1008: 10000008 b 102c <one>
100c: 00000000 nop
1010: 00000000 nop
1014: 10000007 b 1034 <two>
1018: 00000000 nop
...
1024: 10000005 b 103c <three>
1028: 00000000 nop
0000102c <one>:
102c: 03e00008 jr ra
1030: 00000000 nop
00001034 <two>:
1034: 03e00008 jr ra
1038: 00000000 nop
0000103c <three>:
103c: 03e00008 jr ra
1040: 00000000 nop
分支到一个地址为0x1008,一个地址为0x102C,差值为0x24,即9个字。所以是的,你可以看出你从pc + 4到目标的区别。
对于分支到两个0x1034-(0x1014 + 4)= 0x1C,这是7个字,这是编码。
00001000 <_ftext>:
...
0000100c <one>:
...
1018: 1000fff9 b 1000 <_ftext>
101c: 00000000 nop
1020: 1000fffa b 100c <one>
1024: 00000000 nop
同样向后分支0x100C - (0x1020 + 4)= 0xFFF ... FFE8。将其转换为单词0xFF ... FFFA,这就是编码。对于此示例中的其他分支也是如此。
如果您有自己的工具,并且不确定是否存在偏移,编码是什么,等等。只需使用有效的工具,与仅仅询问某人不同,除了更容易和更快。