为什么我们在加载字指令中使用Sign Extend?

fud*_*din 7 mips isa mips32

我正在学习MIPS 32位.我想问一下为什么我们签名扩展16位偏移(在单周期数据路径中),然后在存储字的情况下将其发送到ALU?

小智 12

我不确定它现在对你有用,但无论如何我都会发布它.

让我们从非常一般的意义上考虑C++中的一系列指令,即A [0],A [1],A [2] ......任何两个指令之间的"比喻"距离是1 UNIT.

让我们把它类比为MIPS.在MIPS中,比喻性地,每个指令由"1 UNIT"分隔,然而,1个UNIT = MIPS中的4个字节.每条指令都是4字节长,这就是为什么当从指令移到指令时PC增加4即PC + 4.这样,指令i和指令i + 2之间的差距是"比喻"2但实际上2*4 = 8即PC + 4 + 4

返回分支指令中指定的偏移量,偏移量表示与下一条指令(分支后面的指令)的"比喻"距离.因此,要获得"实际"距离,偏移量将乘以4.这就是我们被指示将偏移"符号扩展"2位到'LEFT'的原因,因为左移任何二进制值n位导致该值乘以2 ^ n.在我们的例子中2 ^ 2 = 4

因此,分支指令的实际目标地址是PC + 4 + 4*Offset.

希望这可以帮助.


jpa*_*jpa 8

听起来像16位偏移是有符号2的补码数,即它可以是正数或负数.

将其转换为32位时,需要将最高有效位复制到高16位以保持符号信息.

  • 基址寄存器的内容是32位,这就是真正进入ALU的内容. (3认同)