我有一个家庭作业问题,这让我很烦恼。 它就像
sll $t0, $s0, 2 // $t0 = $s0 << 2;
add $t1, $t0, $s2 // $t1 = $t + $s2;
lw $s3, $0($t1)
我对$0
感到困惑,是否与0有相同的效果?
结果会给出什么价值?
这是一个问题,要求我将mips翻译成c,其中$ s0表示为变量名a,$ s1 b,$ s2 c等。
本节的答案应为d = c[a];
,
但我真的不明白为什么。
答案 0 :(得分:5)
在MIPS中,$0
或$zero
是第0个索引和第一个寄存器,值为0.请参阅here。
虽然这看起来像一个拼写错误,因为lw
使用16位偏移量,这不是来自寄存器的值而是常量(回想一下寄存器是32位)。所以它应该是lw $s3, 0($t1)
。
如果我将MIPS转换为伪C代码,代码执行d = c[a]
的原因似乎更简单:
$t0 = a*4
$t1 = $t0 + c (= c + a*4)
d = *(c + a*4)
因此,我们最终将d
内存中的值加载到位置c + 4a
的内存中,这是数组c
的基地址,以及我们想要的元素的索引{ {1}}。我们乘以4是因为数组的类型显然是一个4字节长的类型,例如一个4字节的整数,所以我们需要从数组的开头跳转a
个字节到达适当的点。存储器中。