2012-04-06 68 views
0

我想了解MIPS中的数组。我知道你需要将堆栈指针向前或向后移动(增量为4)。但我不知道如何将这个想法实现到MIPS代码中。在MIPS中需要实现一个数组的帮助

j = 0 
x = a[j+k] 
a[j+k] = a[j] 

我知道一定是0加载到寄存器(J = 0),那么我认为你加载字的基址$ A0,并作出[J],那么你之前添加K它将该值转换为0($ a0)。

li $t0, 0  
lw $t0 0($a0) 
add $t0, $t0, $a2 
sw $t0, ($a0) 

我们被分配到该代码转换为MIPS,和以前是它的第一部分。

# Register usage 
# $a0 = base address of array 
# $a1 = n, size of array 
# $a2 = k, the shift amount 

# j = 0 
# x = a[j+k] 
# a[j+k] = a[j] 
# repeat n-1 times 
# j = (j+k) mod n 
# m = (j+k) mod n 
# y = a[m] 
# a[m] = x 
# x = y 
# end repeat 

我的问题是我如何做MIPS中的n-1次循环?是一个条件,然后只是

subi $a1 $a1 

最后如何找到mod?我相信它是与div然后是$ HI。这是我迄今为止所拥有的。

add $t1, $t0, $a2 #j+k 
div $t1, $a1   #divide (j+k) by n 
mfhi $t2    #move rem into t2 
move $t2, $t0  #j = (j+k) mod n 

add $t1, $t0, $a2 #j+k 
div $t1, $a1   #divide (j+k) by n 
mfhi $t2    #move rem into t2 
move $t2, $t0  #m = (j+k) mod n 

sw $t0, 0($t0) 
lw $t3, 0($t0) 

我很迷惑自己,我相信。澄清将不胜感激。

回答

1
li $t3, 0  #j = 0 
lw $t3, 0($a0)  #load the value of @a0 in to j 
add $t3, $t3, $a2 # j = j+k 
sw $t3, 4($a0)  # store the new value of j in to $a0 

loop: 
beq $a1, $zero, return 
sub $a1, $a1, 1  #n = n-1 
add $t4, $t3, $a2 #j+k 
div $t4, $a1   #divide (j+k) by n 
mfhi $t5   

move $t5, $t3  #j = (j+k) mod n 


add $t4, $t3, $a2 #j+k 
div $t4, $a1   #divide (j+k) by n 
mfhi $t5    #move rem into t2 
move $t5, $t3  #m = (j+k) mod n 
b loop 

return: 
sw $t3, 4($a0) 
jr $ra 
lw $t3, 0($a0) 

我在这里和经过一些修补后看到了你的代码。我有程序运行,但输出是错误的,我看到了我的条件和修复它的程序不再返回任何输出的错误。我改变了寄存器。