2017-03-07 4 views
0

배열 하나만 사용하여 배열을 뒤집어 쓰려고합니다. high의 인덱스가 low보다 작거나 같을 때, 나는 high와 low의 내용을 계속해서 스위칭해야합니다. 그러나 주소 범위를 벗어나고 있으며 문제를 해결하는 방법에 대한 리소스를 찾는 데 문제가 있습니다.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 ... 
관련 문제