lw in MIPS(也有点C)

lyn*_*ilu 2 c assembly mips

我有一个功课问题,这让我很烦恼.它就像

sll $t0, $s0, 2    // $t0 = $s0 << 2;

add $t1, $t0, $s2  // $t1 = $t + $s2;

lw  $s3, $0($t1)
Run Code Online (Sandbox Code Playgroud)

我对此感到困惑$0,是否与0具有相同的效果?

结果会带来什么价值?

这是一个问题,要求我将mips翻译成c,其中$ s0表示为变量名a,$ s1 b,$ s2 c等.

本节的答案应该是d = c[a];,但我真的不明白为什么.

dav*_*vin 5

在MIPS中,$0或者$zero是第0个索引和第一个寄存器,并且值为0.请参见此处.

虽然这看起来像一个拼写错误,因为lw使用16位偏移量,这不是寄存器的值而是常量(回想一下寄存器是32位).所以它应该是lw $s3, 0($t1).

d = c[a]如果我将MIPS转换为伪C代码,代码执行的原因似乎更简单:

$t0 = a*4
$t1 = $t0 + c (= c + a*4)
d = *(c + a*4)
Run Code Online (Sandbox Code Playgroud)

所以我们最终加载到d位置的内存中的值c + 4a,这是数组的基地址c,以及我们想要的元素的索引a.我们乘以4是因为数组的类型显然是一个4字节长的类型,例如一个4字节的整数,所以我们需要4*a从数组的开头跳转字节以到达内存中的适当点.