其他答案并没有真正回答您关于如何计算/找到这些十六进制值的问题。所以这是我的答案。
在二进制中考虑这一点比在 HEX 中容易得多。因为 2 位左移对于理解这个概念很重要
2 位乘以 4。
由于简单的十六进制数字是 16 个值,因此不能很好地用十六进制表示。
但我还是想解释一下:
0x20000
1 分支指令使用 16 位立即数字段。 (5 位 RS,RT)(6 位操作码)== 32 位
(https://en.wikibooks.org/wiki/MIPS_Assembly/Instruction_Formats#I_Format)
这 16 位是有符号的。它们可以是正面的也可以是负面的。
这为您提供了-(2^15) == -32768 的有效范围
到+(2^15 -1) == 32767
MIPS 将任何地址输入乘以 4。强制它们按字对齐。
所以你的最小值-(2^15) 乘以 4:-{2^15 *4} (4=2^2), {2^(15+2)} (15+2 == 17):
变成-(2^17) == -131072
二进制(有符号 2 的补码)。
1000 0000 0000 0000 <<2 == 10 0000 0000 0000 00[00]
将其转换为十六进制 10=2 (0000=0) gives 2 0 0 0 0 == 0x20000
这将在添加到 (PC+4) 之前进行符号扩展:
so for say, instruction #32770, PC=0x00420008 (PC+4)=0x0042 000C
0x0042000C - 0x20000 = 0x0040000C, instruction #3(请记住,偏移量基于 PC+4)
#32770+1 +-32768 == 3
0x1FFFC
最大值相同:
(2^15 -1) 乘以 4:{(2^15 -1) *4} (4=2^2), {2^(15+2) -(1*4)} (15+2 == 17):
变成(2^17 -4) == 131068
0111 1111 1111 1111 <<2 == 01 1111 1111 1111 11[00]
将其转换为十六进制 01=1 (1111=F) (1100=C) gives 1 F F F C == 0x1FFFC
注意地址需要加到当前(Program Counter+4)
so for say, instruction #32770, PC=0x00420008 (PC+4)=0x0042000C
0x0042000C + 0x1FFFC= 0x440008, instruction #65538(请记住,偏移量基于 PC+4)
#32770+1 +32767 == 65538
0x0FFFFFFC
2 现在跳转使用 28 位地址。
另请注意,跳转使用绝对地址。不是偏移量。
最大 28 位值为 (2^26 -1) == 67108863, 0x03FFFFFF
``
移位 2 (*4) 变为 28 位。 {(2^26 -1) *4}, == {2^28 -4} ==268435452, 0x0FFFFFFC
但是那缺少的四位呢? ..它们来自PC - 在内存阶段,它已经增加到(PC+4)
对于指令#32770,PC=0x00420008 (PC+4)=0x0042000C
0x0042000C in binary is [0000] 0000 0100 0010 0000 0000 0000 1100
+0x0FFFFFFC in binary [####] 1111 1111 1111 1111 1111 1111 1100 它只有 28 (27:0) 位,缺少 31:28 位。
从 PC+4 获取数据。我们得到:
0000 ---- ---- ---- ---- ---- ---- ---- (PC+4)
---- 1111 1111 1111 1111 1111 1111 1100 (Target-Address)
-----------------------------------------
0000 1111 1111 1111 1111 1111 1111 1100 (Jump-Address)
(在这种情况下与符号扩展它的值相同)
更好地解释如何计算地址。
How to Calculate Jump Target Address and Branch Target Address?