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
D
是 PC + 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。正面和负面的工作方式相同,没有区别。
我正在做旧考试,为即将到来的考试做准备。但是,我不明白这个问题。一些帮助将不胜感激。谢谢!
我明白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
D
是 PC + 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。正面和负面的工作方式相同,没有区别。