2017-01-02 2 views
0

문제가 있습니다. Mips 어셈블리에서 재귀를 사용하여 바이너리 검색 알고리즘을 만들려고했으나이를 해결하는 방법을 이해하지 못하는 오류가 있습니다.Mips 어셈블리에서 재귀를 사용하는 바이너리 검색

나는 10 개의 정수로 구성된 배열을 가지고 있는데 배열이 정렬되어 있다고 가정합니다. 이 정수 그래서 중간에 당신이에서 얻을 4 바이트를 필요로 오른쪽 인덱스가 정말 아니므로이 문제가

  .data 
arr:  .word 40  
arrMsg: .asciiz "Enter the array : \n" 
posMsg: .asciiz "This value exist in the array and its position is " 
pos:  .word 0 
newline: .asciiz "\n" 
valMsg: .asciiz "Enter the value you search for : \n" 
val:  .word 0 
notfound:.asciiz "the value doesn't exist in the array !! \n" 
    .text 
main: 
    # print the array message 
    li $v0, 4 
    la $a0, arrMsg 
    syscall 

    # read the array from the user 
    # put $s0 = i 
    add $s0, $zero, $zero   # i = 0 
for: 
    beq $s0, 40, end 

    li $v0, 5 
    syscall 

    sw $v0, arr($s0)     # input arr[i] 
    addi $s0, $s0, 4     # i = i + 4 

    j for 
end:  

    # print value message 
    li $v0, 4 
    la $a0, valMsg 
    syscall 

    # read the value from the user 
    li $v0, 5 
    syscall 

    # store the value in the val variable 
    sw $v0, val 

    ################################################ 
    ## put $s0 = start , $s1 = middle , $s2 = end ## 
    ################################################ 
    li $s0, 0 
    li $s2, 9 

    jal BinarySearch 

    li $v0, 10 
    syscall 

    ############################################################################################################ 

BinarySearch: 

    # middle = (start + end)/2 
    add $t0, $s0, $s2     # $t0 = start + end 
    sra $s1, $t0, 1     # $s1 = $t0/2 

    # save $ra in the stack 
    addi $sp, $sp, -4 
    sw $ra, 0($sp) 

    # base case 
    ble $s2, $s0, returnNegative1  # if (end <= start) 

    lw $t1, arr($s1)     # $t1 = arr[middle] 
    lw $t2, val      # $t2 = val 
    beq $t1, $t2, returnMiddle   # if (arr[middle] == val) 

    blt $t2, $t1, returnFirstPart  # if (val < arr[middle]) 

    bgt $t2, $t1, returnLastPart  # if (val > arr[middle]) 

    returnNegative1: 
     li $v0, -1 
     j Exit  
    returnMiddle: 
     move $v0, $s1     # return middle 
     j Exit 

    returnFirstPart: 
      move $t3, $s1    # temp = middle  
      addi $t3, $t3, -1   # temp -- 
      move $s2, $t3    # end = temp 
      jal BinarySearch 
     j Exit 

    returnLastPart:        
     move $t3, $s1     # temp = middle 
     addi $t3, $t3, 1     # temp++ 
     move $s0, $t3     # start = temp 
     jal BinarySearch 
     j Exit 

Exit: 
    lw $ra, 0($sp) 
    addi $sp, $sp, 4` 
    jr $ra 

답변

1
lw $t1, arr($s1)     # $t1 = arr[middle] 

.. 내가 어떤 도움 사전에 감사 감사, 내 코드입니다

add $t0, $s0, $s2     # $t0 = start + end 
sra $s1, $t0, 1     # $s1 = $t0/2 

는 논리적 주소가 아닌 당신이 그것을 곱해야합니다 진짜 4

mul $s4, $s1,4 

하고 또한 정지 상태에 실수가

lw $t1, arr($s4)     # $t1 = arr[middle] 

주소로 $s4를 사용하는 것이 매우 내 영어

+0

감사에 대한 if (end < start)하지 (< =)

미안해야 귀하의 회신에 대한 .. 당신은 내게 많은 도움을 –

+0

하지만 내가 실행하면 나는 여전히 출구 블록에있는 addi $ sp, $ sp, 4에 오류가 있습니다. –