2012-11-03 5 views
2

MIPS에서 병합 정렬 알고리즘을 만들려고하고 있으며 코드에서 버그를 발견했습니다. 내 프로그램에서, 내 배열 (각각 $a0$a1)의 시작점과 끝점에 대한 참조를 유지합니다. 나는 또한 그 길이를 추적하고있다 $a1 - $a0 + 4. 문제는 배열의 중간 점을 올바르게 계산하는 방법을 모른다는 것입니다. 나는이 해당 기능을 C에서 호출을 위해 그렇게해야합니다MIPS에서 배열의 중간 점 찾기 - 정렬 병합

mergesort(a, start, mid); 
mergesort(a, mid + 1, end); 

난 당신이 4 비트 주소를 산술을 어떻게 정확히 모르겠어요 그래서 MIPS에 새로운 해요. 주소를 두 개 추가하면 오버플로가 발생하므로 주소를 ($a0 + $a1)/2으로 추가 할 수 없습니다.

내 배열이 같은 상단에 선언 :

array: .word 0:15 

내가하지 더 15 이상의 숫자가 입력 될 것이라고 가정 할 수있다. $s0, $s1 (마지막 요소 이후 공간에 대한 포인터), $a0 (기점 인자() 어레이의 시작에 대한 포인터), 및 $a1 (종점 인수) 모두 같이 저장되어

la $s0, array 
move $s1, $s0 // $s1 increments by 4 each time an element is added 
... 
move $a0, $s0 
addi $a1, $s1, -4 // subtract four because we want to refer to the last element 

$ a0 및 $ a1을 참조로 사용하여 해당 배열의 중간 인덱스를 계산하려면 어떻게해야합니까? 어떤 도움을 주시면 감사하겠습니다. 감사!

답변

1

($a0 + $a1)/2 = $a0 + ($a1 - $a0)/2 오버플로가 발생하지 않습니다.

0

중간 오버플로에 대해 걱정할 필요가 없습니다. 부호없는 추가 (오버플로 없음)를 사용한 다음 오른쪽으로 1 비트 이동하여 2로 나누십시오.

addu $a2, $a0, $a1 # $a0 and $a1 hold start and end addresses 
    srl $a2, $a2, 1  # $a2 holds mid address