我坚持这个问题。我得到了一个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。
由于
答案 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
。