MIPS SW & LW 负偏移

MIPS SW & LW negative offset

我正在做旧考试,为即将到来的考试做准备。但是,我不明白这个问题。一些帮助将不胜感激。谢谢!

我明白A、C、D是什么了。但是我一生都无法理解如何得到 B 和 E 的答案。 我不知道当 SW 和 LW 使用负 'offset' 值时会发生什么?

答案是:

A 是符号扩展立即值——这里是 -20(I 型立即数的 16 位中的 0xFFEC)在符号扩展到 32 位之后。符号扩展是指用与 16 位立即数的符号位相同的值填充 32 的高 16 位,即高 16 位要么全 0 要么全 1,具体取决于 16 位立即数的符号。如果 16 位立即数是负数,那么用 1 填充 32 的前 16 位保持相同的值(-20)。

B 看起来它正在标记数据存储器旁路,在这种情况下,它保存了负载的 32 位有效地址——而这个值被馈送到数据存储器(在 DataMemory.A), lw.

不消耗这个馈送到下一个多路复用器的特定数据路径

C是加载的目标寄存器,$s2

DPC + 4 设置执行 lw

之后的下一条指令

E是从内存中读取的值。

请从理解代码开始

   40210:   20083ff0    addi    ,[=10=],16368
   40214:   21080010    addi    ,,16
   40218:   ad08fff8    sw  ,-8()
   4021c:   2108000c    addi    ,,12
   40220:   8d12ffec    lw  ,-20()

然后检查图片,有了答案并看到代码就可以把点连接起来,当然在得到答案之前会有更多的工作,但无论哪种方式都必须完全理解代码。

40210:  20083ff0    addi    ,[=11=],16368
 = 0 + 0x3FF0 = 0x00003FF0

40214:  21080010    addi    ,,16
 =  + 16 = 0x3FF0 + 0x10 = 0x4000

40218:  ad08fff8    sw  ,-8()
memory_address  - 8 = contents of 
[0x4000 - 8] = 0x4000
[0x4000 + (-8)] = 0x4000
[0x4000 + (0xFFFFFFF7 + 1)] = 0x4000
[0x00004000 + 0xFFFFFFF8] = 0x4000
[0x00003FF8] = 0x4000

4021c:  2108000c    addi    ,,12
 =  + 12 = 0x4000 + 0xC = 0x400C

40220:  8d12ffec    lw  ,-20()
 = [ - 20]
 = [0x0000400C - 0x14]
 = [0x0000400C + (-0x14)]
 = [0x0000400C + 0xFFFFFFEC]
 = [0x00003FF8]
 = 0x4000

可以看到最后一条指令是0xFFEC,然后A符号前面的符号扩展将第15位扩展成0xFFFFFFEC。

B 是 alu 的输出 0x0000400C + 0xFFFFFFEC = 0x00003FF8

C 是指令的位 20:16,0x12,0x12 = 18,如 $18

D为下一条指令地址0x40224

E 0x4000 读取0x3FF8的结果。

了解此图不是真正的设计这是一个学术练习,但我假设您已经使用此图 weeks/months/chapters。所以看完reading/understanding代码大家应该熟悉了。 C 应该是下一条指令或两条指令之后的位,而不是当前指令。但是不要试图在这一点上纠正教授,你会输的。学校的教授是对的,然后现实是对的,还是你的boss/mentor。 D也错了,其实大部分都是错的,不过没关系,按照教的方式使用它,这是一种视觉练习。

幸好你有答案,否则我们会根据图中所示给你答案,而不是根据你所教的内容。这会让你更加困惑。

偏移量没有魔法

addi $t0,$zero,0x1010
sw $t1,-8($t0)
sw $t1,8($t0)

   0:   20081010    addi    ,[=12=],4112
   4:   ad09fff8    sw  ,-8()
   8:   ad090008    sw  ,8()

因此将 0x1010 放入寄存器 $8

然后根据指令集偏移量是sw的低16位 指令符号扩展我们在指令中看到 0xFFF8,我们符号扩展 位 15 得到 0xFFFFFFF8 将其添加到 $8 中的值,0x00001010 你得到 0x00001008。对于第三条指令,相同的交易符号将 0x0008 扩展到 0x00000008 和 0x00001010+0x00000008 = 0x00001018。正面和负面的工作方式相同,没有区别。