assembly - MIPS 分支指令的最大单次跳转范围是如何计算的?
问题描述
我正在研究计算机体系结构(MIPS 体系结构)并阅读以下陈述:
1. 分支指令有一个 16 位有符号字偏移字段,允许从当前位置分支到地址 + 或 -128kBytes (+0x1FFFC TO -0X20000)。
2.跳转指令在程序计数器最高有效4位指定的当前256MByte(0x0FFFFFFC)区域内指定地址。
我理解上述跳转范围的概念,但是如何使用“256Mbyte 的范围”和“+-128 kbytes 的范围”计算三个数字 0x0FFFFFFC、0x1FFFC 和 0X20000?
谢谢!
解决方案
其他答案并没有真正回答您关于如何计算/找到这些十六进制值的问题。所以这是我的答案。
在二进制中考虑这一点比在 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)
(在这种情况下,它的值与扩展它的符号相同)
更好地解释如何计算地址。 如何计算跳转目标地址和分支目标地址?
推荐阅读
- python - 在 Keras 中使用自定义层加载保存的模型和预测结果不同?
- php - 为什么空字符串不起作用但 null 工作得很好?
- java - 无法在 docker 中初始化类 sun.security.ec.SunEC 异常
- ibm-cloud - Webhook 与 Watson Assistant 的集成?
- php - 具有正则表达式含义的 codeigniter 路由
- android - 此 NavController 不知道导航 DESTINATION_NAME,重新打开之前使用 navController.popBackStack() 关闭的片段?
- c - 在这种情况下如何使用双指针
- html - 我无法通过 CSS 在 HTML 页面中放置图像
- python - 将 3D 数组大小调整为 2D
- excel - 获取脚本中声明的“文件名”