MIPS SW和LW负偏移

时间:2020-05-20 15:27:09

标签: assembly mips

我正在做旧考试以学习即将参加的考试。但是,我不明白这个问题。一些帮助将不胜感激。谢谢!

enter image description here

我理解A,C和D是什么。但是我一生无法理解如何获得B和E的答案。 我不知道SW和LW使用负“偏移”值时会发生什么情况?

答案是:

2 个答案:

答案 0 :(得分:1)

A是符号扩展立即值-在此处符号扩展到32位后为-20(从I型立即数起16位为0xFFEC)。符号扩展意味着将32位的高16位填充为与16位立即数的符号位相同的值,即取决于16位立即数的符号,这些高16位要么全为0要么全为1。如果16位立即数为负,则用1填充32的前16位将保持相同的值(-20)。

B看起来像是在标记数据存储器旁路,在这种情况下,它保存了负载的32位有效地址-当此值被馈送到数据存储器(位于DataMemory.A)时, lw不会占用馈送到下一个多路复用器的特定数据路径。

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

DPC + 4设置为执行lw之后的下一条指令

E是从内存中读取的值。

答案 1 :(得分:0)

请先了解代码

   40210:   20083ff0    addi    $8,$0,16368
   40214:   21080010    addi    $8,$8,16
   40218:   ad08fff8    sw  $8,-8($8)
   4021c:   2108000c    addi    $8,$8,12
   40220:   8d12ffec    lw  $18,-20($8)

然后检查图片,并给出答案,然后看一下可以连接点的代码。在得到答案之前,要完成一些工作,但是无论哪种方式都必须完全理解代码。

40210:  20083ff0    addi    $8,$0,16368
$8 = 0 + 0x3FF0 = 0x00003FF0

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

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

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

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

您会在最后一条指令中看到0xFFEC,然后在A符号前面的符号扩展将第15位扩展为0xFFFFFFEC。

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

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

D是下一条指令地址0x40224

E 0x4000读取0x3FF8的结果。

了解这幅图并不是真实的设计,这是一项学术练习,但是我认为您已经使用该图了数周/数月/章。因此,在阅读/理解代码之后,您应该熟悉它。例如,C应该是下一条指令中的位,或者是后两条指令中的位,而不是当前位。但是不要试图纠正教授这一点,您会迷失方向。教授就学校而言是正确的,在那之后现实就是正确的,或者您的老板/导师是正确的。 D也是错的,实际上大多数人都是错的,但是没关系,按照教学的方式使用它,这是一种视觉练习。

好的,您有答案,否则我们会根据显示的图形而不是您所教的知识为您提供答案。这会让您更加困惑。

偏移量没有魔力

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

   0:   20081010    addi    $8,$0,4112
   4:   ad09fff8    sw  $9,-8($8)
   8:   ad090008    sw  $9,8($8)

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

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

相关问题