首页 > 解决方案 > MIPS 分支指令的最大单次跳转范围是如何计算的?

问题描述

我正在研究计算机体系结构(MIPS 体系结构)并阅读以下陈述:

1. 分支指令有一个 16 位有符号字偏移字段,允许从当前位置分支到地址 + 或 -128kBytes (+0x1FFFC TO -0X20000)。

2.跳转指令在程序计数器最高有效4位指定的当前256MByte(0x0FFFFFFC)区域内指定地址。

我理解上述跳转范围的概念,但是如何使用“256Mbyte 的范围”和“+-128 kbytes 的范围”计算三个数字 0x0FFFFFFC、0x1FFFC 和 0X20000?

谢谢!

标签: assemblymips

解决方案


其他答案并没有真正回答您关于如何计算/找到这些十六进制值的问题。所以这是我的答案。

在二进制中考虑这一点比在 HEX 中要容易得多。因为 2 位左移对于理解 2 位乘以 4 的概念很重要。由于简单的 Hex 数字是 16 个值,因此不能很好地用 HEX 表示。但我仍然试图解释它:

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)

(在这种情况下,它的值与扩展它的符号相同)

更好地解释如何计算地址。 如何计算跳转目标地址和分支目标地址?


推荐阅读