我正在学习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.
希望这可以帮助.