2011-09-18 67 views

回答

8

16位偏移量的声音是有符号的2's complement数字,即它可以是正数也可以是负数。

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

+0

我的意思是,为什么我们需要将其转换为32位?进入ALU的另一个寄存器(基址寄存器)不是32位,而是5位。为什么这需要32位? –

+2

基址寄存器的内容是32位,这就是真正进入ALU的内容。 – jpa

10

我不确定它现在对您有帮助,但我仍然会发布它。让我们从一个非常一般的意义上考虑一下C++中的指令数组,即A [0],A [1],A [2] ..... 任何两条指令之间的“比喻”距离是1 UNIT。

让我们来比喻MIPS。在MIPS中,象征性地,每个指令由“1个单元”分隔,然而,1个单元= 4个MIPS中的字节。每条指令的长度都是4字节,这就是为什么当从指令转到指令时,PC增加4即PC + 4。这样,指令i和指令i + 2之间的差距就是“比喻性”2但实际上是2 * 4 = 8即PC + 4 + 4回到在分支指令中指定的偏移量,偏移量代表与下一条指令(分支之后的指令)之间的“比喻性”距离。因此,要获得“实际”距离,偏移量应乘以4.这就是我们被指示将偏移量“签名扩展”到“左”的原因的原因,因为左移任何二进制值n位导致该值乘以2^n。在我们的例子中,2^2 = 4

所以分支指令的实际目标地址是PC + 4 + 4 * Offset。

希望这会有所帮助。

0

据我所知,在加载或存储指令中,偏移值被添加到临时寄存器中的值,作为临时值。寄存器是32位,16位和32位的加法操作是不可能的,该值是符号扩展的。

0

我认为你在这里让你的概念有点不对。

您认为进入ALU的5位实际上进入寄存器存储器中以选择32 [2^5]个寄存器之一。

每个寄存器本身是32位的。因此,要将偏移量添加到寄存器值,您需要将其扩展到32位。

ALU操作始终在MIPS的单周期数据路径中具有相同大小的两个寄存器之间。

0

在32位机器的硬件中,大多数ALU采用32位输入,所有寄存器都是32位寄存器。

要处理您的数据,它必须是32位宽,这就是为什么我们需要SIGN-extend,但是另一种方法是零扩展,但是在处理立即数和偏移量时要使用SIGN-extend来保存2的补码。

0

符号扩展发生在例如在M68xxx机器的情况下仅在加载地址寄存器的情况下。在数据寄存器的情况下不是这样。

例如,

movea.w addr,a0 
move addr,d0 
addr: 
dc.w $FFFF 

导致数据的情况下,寄存器加载到$ 0000FFFF,然而,在 地址寄存器加载到$ FFFFFFFF的情况。

为了理解这一点,构建两个互补的签名为负的 演示文稿$ FFFF,将数字扩展为32位并重做两个补充,在32位中找到相应的表示形式。

欢呼和亲切的问候, 斯蒂芬S.

相关问题