首页 文章

Mips中的递归

提问于
浏览
0

我正在试图弄清楚如何编写一个函数来找到MIPS后面的最低整数...

int Min( int[] A, int low, int high)
{   if (low== high) return A[low];
     int mid = (low+high)/2;
     int  min1 = Min( int[] A, low, mid);
     int   min2 =Min( int[] A, mid +1, high);
     if(min1>min2) return min2;
     return min1;
}

当我尝试用MIPS编写代码时,我遇到了问题 . 这是我目前的MIPS代码 . 用户输入最多6个存储在数组中的整数 . 寄存器$ a0,$ a1和$ a2用作函数的参数 .

  • $ a0 = int [] A.

  • $ a1 = int low // index

  • $ a2 = int high // index

这是递归函数......

min:
bne $a1, $a2, recur
mul $t4, $a1, 4
add $a0, $a0, $t4
lw $v1, 0($a0) 
jr $ra
# recursion start
recur:
addiu $sp, $sp, -12 #reserve 12 bytes on stack
sw $ra, 0($sp) #push return address
# mid = (low+high)/2 t0 = mid t1= min1 t2=min2 t3 = mid+1
add $t0, $a1, $a2 # t0 = low + high
div $t0, $t0, 2 # t0 = (low+high)/2


# mid1 = min(int[]A,low,mid)
min1:
sw $a2, 4($sp) #push high
addi $t3, $t0, 1 # mid+1
sw $t3, 8($sp) #store mid+1
move $a2, $t0 #change high to mid
jal min #compute
# check
move $t1, $v1 #set up the min1 = return value

# mid2 = min(int[]A,mid+1,high)
min2:
lw $a2, 4($sp) #reload high prior call
lw $a1, 8($sp) #change low to mid+1
jal min #compute
move $t2, $v1 #set as the min2 = return value

confirm:
# return mid2 if mid1 > mid2
bgt $t1, $t2, returnMid2
# else return mid1
move $v1, $t1
j minFinal
returnMid2:
move $v1, $t2
minFinal:
lw $ra, 0($sp)
addiu $sp, $sp, 12 #release stack
jr $ra

问题是我在程序中输入的整数组合,我从来没有得到最小值,而是数字“543976553” . 我一直在查看我的代码和笔记,但我仍然没有线索 .

2 回答

  • 0

    对于mid1,尝试将返回值放在堆栈上,然后在调用mid2之后将其移动到$ t1 . 然后将$ v0与$ t1进行比较,而不是将$ t1与$ t2进行比较

  • 1

    在MIPS中使用div命令时,是否需要从$ LO获取商?

    因此,(高低)/ 2的逻辑可能看起来像

    add $t0, $a1, $a2 # t0 = low + high
    addi $t5, $zero, 2 # t5=2
    div $t0, $t5 # LO = t0/t5, HI = t0%t5
    addi $t0, $LO, 0 # t0 = LO (t0/t5)
    

    这些行中的一些是我学习如何学习MIPS的,但是你可能有不同的样式来将立即值加载到寄存器中 .

    我也不能保证这会解决所有问题,但乍一看,这是我注意到的事情 .

相关问题