我正在学习MIPS 32位。我想问一下,为什么我们签名扩展16位偏移量(在单周期数据路径中),然后在存储字的情况下将其发送到ALU?
答案 0 :(得分:10)
我不确定它现在对你有帮助,但无论如何我都会发布它。
让我们从非常一般的意义上考虑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。
希望这会有所帮助。
答案 1 :(得分:8)
听起来16位偏移是一个带符号的2's complement数字,即它可以是正数也可以是负数。
将其转换为32位时,需要将最高有效位复制到高16位,以保留符号信息。
答案 2 :(得分:0)
据我所知,在加载或存储指令中,偏移值被添加到临时寄存器中的值,作为temp。寄存器为32位,无法进行16位和32位的加法运算,值为符号扩展。
答案 3 :(得分:0)
我认为你这里的概念有点不对劲。
您认为在ALU内部的5位实际上进入寄存器存储器以选择32 [2 ^ 5]寄存器中的一个。
每个寄存器本身为32位。因此,要将偏移量添加到寄存器值,您需要将其扩展为32位。
在MIPS的单周期数据路径中,ALU操作始终位于两个相同大小的寄存器之间。
答案 4 :(得分:0)
在32位机器的硬件中,大多数ALU采用32位输入,所有寄存器都是32位寄存器。
要处理你的数据,它必须是32位宽,这就是我们SIGN扩展的原因,但是另一种方法是ZERO-extend,但是当你处理immediates和offsets以保留时,会使用SIGN-extend。签到2的补充。
答案 5 :(得分:0)
签名扩展例如发生在M68xxx机器的情况下仅在加载地址寄存器的情况下。在数据寄存器的情况下不是这样。
有例如。
movea.w addr,a0
move addr,d0
addr:
dc.w $FFFF
如果数据寄存器加载到$ 0000FFFF,则导致 地址寄存器加载到$ FFFFFFFF。
要理解这一点,请构建签名否定的两个补充 演示文稿,$ FFFF,将数字扩展到32位并重做两次 - 补码,找到32位的相应表示。
欢呼和亲切的问候, 斯蒂芬S.