了解MIPS汇编代码段

时间:2015-01-23 17:59:33

标签: c arrays assembly mips

刚开始为我的一个类学习汇编,我对这段代码感到有点困惑。这是一个教科书问题,要求您将MIPS指令翻译为C.其余问题在附图中。

对于上面的MIPS装配说明,相应的是什么 C声明?假设变量f,g,h,i和j分别分配给寄存器$ s0,$ s1,$ s2,$ s3和$ s4。假设数组A和B的基址分别位于寄存器$ s6和$ s7中。

sll  $t0, $s0, 2    # $t0 = f * 4
add  $t0, $s6, $t0  # $t0 = &A[f]
sll  $t1, $s1, 2    # $t1 = g * 4
add  $t0, $s6, $t0  # $t1 = &B[g]
lw   $s0, 0($t0)    # f = A[f]
addi $t2, $t0, 4
lw   $t0, 0($t2)
add  $t0, $t0, $s0
sw   $t0, 0($t1)

我对一些MIPS指令有基本的了解,但坦率地说,带阵列的东西让我感到困惑。这里有人能指出我正确的方向吗?谢谢!

1 个答案:

答案 0 :(得分:0)

自从我上次写MIPS汇编以来已经有一段时间了。但是,根据我从前几条指令中可以理解的内容:

sll $t0, $s0, 2     # t0 = 4 * f
add $t0, $s6, $t0   # t0 = &A[f]

s0包含您要访问数组f的索引A。由于您将f乘以4,A是一个长度为4个字节的数据类型的数组(可能是一个int)。 s6持有数组地址,因为要访问基本上做A[f]的地址(在伪代码中)

address_of_A[f] = base_address_of(A) + offset_of_type_int(f)

原则上在接下来的2条指令中会发生相同的事情,但这次是数组B。之后:

lw $s0, 0($t0)      # f = A[f]
addi $t2, $t0, 4    # t2 = t0 + 4 

第一次加载很明显,s0获取地址t0的值,当然是A[f]。第二个将t0增加4并将其存储到t2,这意味着t2现在包含地址&A[f+1],因为我们知道数组A包含4字节数据。

最后lw命令:

lw $t0, 0($t2)

将地址$t2的值存储在$t0上,因此$t0现在为A[f+1]