繁体   English   中英

为什么 I 型立即数从 16 位扩展到 32 位?

[英]Why does the I-type immediate get extended from 16 bit to 32 bit?

我正在准备大学考试,我不明白为什么 I 类型中的直接字段从 16 位扩展到 32 位,我需要知道什么解释,还是只是您必须知道发生的事情在不知道为什么的架构中?

也在计算分支地址时

PC <– PC + 4 + (sign_ext(Imm16) << 2)

为什么立即数会移位 2?

正如许多评论中已经回答的那样......

尽管 MIPS 确实有 16 位指令格式,但每个人都熟悉的指令集是 32 位固定长度指令集,在对齐的边界上。

各种操作使用 32 位操作数。

在固定为 32 位的指令集中不能有 32 位立即数; 没有位留给操作码。 因此,MIPS 具有不同的指令格式和不同的立即数大小,以平衡丰富的指令数组,而不会像使用立即数或强制从附近的池中加载所有立即数那样痛苦。 在最坏的情况下,您可以依靠它,但是对于很多事情,您可以按照设计使用说明。

所以立即数字段远小于32位,但它们所代表的操作数一般都是32位,因此需要以某种方式进行扩展,要么移位16位并在底部填充零,要么从顶部扩展无符号或不(一般而言,不仅仅是针对这种类型的 mips)来生成 32 位值。

应根据文档中的说明查找立即数的使用方式。

为什么分支将立即数移动 2?

指令在对齐的 32 位边界上,这意味着低 2 位始终为零。 如果您将这些零编码到立即数中,您将始终必须将它们设为零,并且基本上会丢失 pc 相对分支的可能范围的四倍。 在这种情况下,将立即数视为我想要分支的指令数,而不是地址的字节数。

签名允许向前或向后分支。

nextPC <– PC + 4 + (sign_ext(Imm16) << 2)

+ 4 是管道错觉的一部分,不同的内核有自己的管道设计,所以必须有一个标准来让 ISA 不会疯狂使用(在许多 ISA 中非常典型的设计选择让 PC 在执行时间点在下一条指令)。 所以 nextPC 是下一条指令的 PC 加上立即数中指令的有符号偏移量(通过左移两位使低两位为零)。 如果满足条件或无条件(我不知道所有的 I 格式指令,我不需要为了回答这个问题)那么逻辑使用 nextPC 否则 PC + 4 用于下一条指令.

编辑

是的,你是对的; 符号扩展已经使它成为一个 32 位值。 额外的移位是最大化分支可以采用的范围,使我们可以使用这种指令格式向前或向后四倍地进行分支。 高符号扩展位都是 0 或 1,并且扩展位超过 2 位,因此将临时 32 位值再移动两位不会对该值造成损害。

使用 16 位带符号立即数,如果我不想进行两次移位,那么 0x00007FFC 是我可以向前分支的最大距离,并且要成为有效指令,低两位必须为零。 通过移位,我现在可以向前分支 0x1FFFC,并且可以使用所有立即数位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM