2017-03-07 107 views
0

我想只使用一个数组来反转数组。当高指数小于或等于低时,我应该继续切换高低的内容。但是,我得到的地址超出范围,并且无法找到如何修复它的资源。我应该在倒序数组时使用一个数组。我究竟做错了什么?加星标是我得到错误的地方。在MIPS汇编中获取地址超出范围?

reverseArray: 

     li $t6, 0 #head = first index of array 
     la $s0, array 
     li $t5, 4 
     mult $s0, $t5 
     mflo $t7 #tail = last index of array 



swap: 
    lw $t6, 0($s0) 
    **lw $t4, 0($t7)**  

    sw $t4, 0($s0) 
    sw $t6, 0($t7) 

    add $t7, $t7, -4 
    add $s0, $s0, 4 

    sle $t1,$t7,$s0 
    beq $t1,$0,swap 
+0

您正在使用索引作为指针。你需要添加基地址。 – Jester

+0

我该怎么做?什么是基地址?对不起,我刚刚开始。 @Jester –

+0

'$ s0'是基地址,你似乎把它乘以4.这是错误的。您希望按元素大小乘以元素数并添加基地址。 – Jester

回答

0

我假设你想在$t7什么是数组的最后一个元素的地址。将基地址乘以4不会给你那个地址。你需要计算的是array + (length-1)*4
所以你需要知道数组的长度。您发布的代码并不表示您知道数组的长度,但假设您已获得寄存器$t6中的长度。您需要执行的算法为:

addiu $t7,$t6,-1 # $t7 = length-1 
sll $t7,$t7,2  # $t7 = (length-1)<<2 == (length-1)*4 
addu $t7,$t7,$s0 # $t7 = (length-1)*4 + array 

swap: 
    lw $t6, ($s0) 
    lw $t4, ($t7) 
    ... etc ...