lw in MIPS(也有点C)

时间:2011-06-07 13:09:35

标签: c assembly mips

我有一个家庭作业问题,这让我很烦恼。 它就像

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];, 但我真的不明白为什么。

1 个答案:

答案 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个字节到达适当的点。存储器中。