如何在此MIPS代码的基础数组中存储偏移量?

时间:2014-08-10 19:41:49

标签: c mips

我坚持这个问题。我得到了一个C代码,我需要将其转换为MIPS。

这是C代码:

for (c = 0; c < a; c++)
    for (d = 0; d < b; d++)
        D[8*d] = c + d;

假设a,b,c,d的值在寄存器$ s0,$ s1,$ t0和$ t1中。寄存器$ s2也包含数组D的基址。

到目前为止,这是我的以下MIPS代码:

       add   $t0, $zero,  $zero     # initialize c = 0
LOOP1: slt   $t2, $t0,    $s0       # temp reg $t2 = 1 if $t0 < $s0
       beq   $t2, $zero,  DONE      # if $t2 = 0, go to DONE
       add   $t1, $zero,  $zero     #initialize d = 0
LOOP2: slt   $t3, $t1,    $s1       # temp reg $t3 = 0 if $t1 < $s1
       beq   $t3, $zero,  L1        # if $t3 = 0, jump to L1 (current iteration of
                                    #LOOP1)
       sll   $t1, $t1,    3         # $t1 = $t1 << 8 where (8 * d)

       ????

       addi  $t1, $t1,    1         # increment d = d + 1
       j     LOOP2                  # jump back to LOOP2
  L1:  addi  $t0, $t0,    1         # increment c = c + 1
       J     LOOP1                  # jump back to LOOP1
DONE:

我被困在哪里是在“????”因为我不知道如何存储包含8 * d的$ t1,回到$ s2。

由于

1 个答案:

答案 0 :(得分:1)

一个问题是,您每次通过d都会覆盖LOOP2中的值 - 并使用您所说的“{1}}声明”替换d与d * 8&#39;。你应该将它存储在另一个临时寄存器中,这样你就不会破坏你的循环计数器 - 即。 sll $t1, $t1, 3

接下来,您需要确定地址sll $t4, $t1, 3是什么。由于您已将8 * d存储在寄存器D[8 * d]中,因此只需将这两个寄存器添加到一起即可{ - 1}}。现在,$t4包含您需要存储的地址。

剩下的唯一事情就是计算价值并存储它 - 计算它很简单,它只是add $t5, $s2, $t4所以你需要的只是将它存储在另一个临时寄存器中 - $t5

现在,c + d包含值,add $t6, $t0, $t1包含地址。您只需将$t6存储到$t5 - $t6