Assembly MIPS软件及;负偏移量

Assembly MIPS软件及;负偏移量,assembly,mips,Assembly,Mips,我在做旧的考试,为即将到来的考试做准备。不过,我不明白这个问题。如果能帮上点忙,我将不胜感激。谢谢 我明白什么是A,C和D。但我一辈子都不明白如何得到B和E的答案。 我不知道SW和LW使用负“偏移”值时会发生什么情况 答案是: A是符号扩展立即数值-此处为-20(I型立即数中16位的0xFFEC),位于符号扩展到32位之后。符号扩展意味着用与16位立即数的符号位相同的值填充32的前16位,即,根据16位立即数的符号,这些前16位要么全部为0,要么全部为1。如果16位立即数为负数,则用1填充32

我在做旧的考试,为即将到来的考试做准备。不过,我不明白这个问题。如果能帮上点忙,我将不胜感激。谢谢

我明白什么是A,C和D。但我一辈子都不明白如何得到B和E的答案。 我不知道SW和LW使用负“偏移”值时会发生什么情况

答案是:

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

B
看起来像是在标记数据内存旁路,在本例中,该旁路保存加载的32位有效地址-当该值馈送到数据内存(位于DataMemory.A)时,馈送到下一个mux的特定数据路径不会被
lw
消耗

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

D
PC+4
为执行
lw


E
是从内存中读取的值。

请先了解代码

   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,然后符号前面的符号扩展将位15扩展到0xFFFFFFEC

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

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

D是下一个指令地址0x40224

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位获得0xFFFFF8,将其添加到$8的值中,0x00001010获得0x00001008。对于第三条指令,相同的交易符号扩展0x0008到0x00000008,0x00001010+0x00000008=0x00001018。正和负的工作方式相同,没有区别。

与正偏移值没有区别。如果我有一些地址0x1010,并且使用了4的正偏移量,那么这意味着我需要0x1014。如果使用负偏移量8,则表示需要0x1008。0x3FF0+0x10-0x8=0x4000-8=0x3FF8。好的,在第二个addi t0=0x4000之后。当SW将t0-8存储在t0中时,0x3ff8是否存储在t0中?否,值0x4000存储在内存中<代码>软件不改变寄存器;仅更改了一个内存位置。t0=0x3ff0+0x10=0x4000。然后0x4000+0xC=0x400C。然后0x400C-0x14=0x3ff8停止查看图片,首先找出您似乎不理解的部件。一旦你完全理解了装配,你就可以再看一次图片了。我没有得到的是如何计算,例如,E。我得到的值是0x3ff0。答案是0x4000您必须知道有效地址的内存位置中有什么。我们知道那个内存位置是什么,因为存储
sw
只是把它放在那里。从第一个addi开始,t0=0x3ff0。第二个addi,t0=0x4000。我猜,减去8,所以t0=0x3ff8。第三个addi然后添加12,t0=0x4004。最后,lw使s2=t0-20,这使t0=0x3ff0。
sw
不会更改寄存器。它只改变内存。好吧,但当LW做它的事情时,如果它以20递减,它怎么能“找到”t0呢?