微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存传输控制

如何解决内存传输控制

我想弄清楚下面的代码可以传输的最低值和最高值是多少。指令序列从内存地址 0x40000000 开始。如果寄存器 $3 中包含的值小于寄存器 $4 中包含的值,则该序列将控制转移到标签“TRUE”处的指令。

slt $2,$3,$4
bne $2,$0,TRUE
nop

知道 MIPS 内存地址范围从低的 0 到高的 0xFFFFFFFF。十六进制的最低内存地址是多少? “最低地址”被定义为解释为无符号整数时的最小地址。十六进制的最高内存地址是多少? “最大地址”定义为解释为无符号整数时的最大地址

最低的不是0x40000008,最高的不是0xFFFFFFFF吗?

解决方法

分支指令,与所有 MIPS 指令一样,都是 32 位宽。

32 位没有足够的空间来编码 32 位常量以及分支操作码和两个寄存器编号。

因此,分支指令的范围是有限的。它们被编码为具有 16 位立即数字段的 I-Type 指令。分支指令能够向前或向后跳转,这是通过将 16 位立即数视为有符号字段来实现的。

分支立即数范围从 -32768 到 +32767。

由于 MIPS 指令都是 32 位宽且字对齐,因此程序计数器的低 2 位始终为零。任何两条指令之间的差异始终是 4 的倍数——另一种说法是低 2 位为零。因此,这两个始终为零的低位不会在分支指令的立即数中编码。

然而,要形成一个字节地址,我们必须将这两个零加回来;这是通过将立即数乘以 4 来完成的。

因此,16 位立即数字段的字节地址范围是 -131072 到 +131068。

该范围与分支后的指令或分支后的两条指令相关 - 取决于处理器是否没有分支延迟槽(或分别有)。

因此,如果 slt 位于位置 X 则分支位于位置 Y=X+4 并且假设处理器正在执行分支延迟槽(因为您的 nop 在分支暗示了这一点)那么该分支可以相对于 Y+8 的程序计数器值进行,因此 Y 位置的分支指令可以达到的范围是从 Y+8 - 131072 到 Y+8 + 131068。

比这更远的分支是可能的,但在生成更大的立即数时需要更长的代码序列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。