我正在编写一个MIPS移动元音函数,现在我陷入无限循环,因为返回地址有问题。有人可以帮忙吗?该问题仅适用于功能“ moveVowelsToBeginning”,功能countvowels和isVowels可以正常工作。 C代码:
char myName[8] = "example";
int main()
{
vowels=countvowels(0,6); //count the vowels using recursion
moveVowelsToBeginning(0,6); //move vowels to the beginning
return 0;
}
int countvowels(int low, int high)
{
omit...
}
int isVowel(int low) // whether the indexed character is a vowel
{
if vowel ("omit code here")
return 1;
else
return 0;
}
int moveVowelsToBeginning(int low, int high)
{
int i, j; //two indexes
char temp;
j=low; //this index used as head of detected vowels
for(i=low;i<=high;i++)
{
if(isVowel(i))
{
//swap characters
temp = myName[j];
myName[j]= myName[i];
myName[i] = temp;
j++;
}
}
}
函数moveVowelsToBeginning的MIPS代码:
moveVowelsToBeginning:
addiu $sp,$sp,-16 #stack grows by 16 bytes
sw $ra,12($sp) #save return address
sw $a0,0($sp) #save the arguments into stack
sw $s0,4($sp) #$s0 is used to hold the variable i
sw $s1,8($sp) #$s1 is used to hold the variable j
add $s0,$zero,$a0 #i==0
add $s1,$zero,$a0 #j==0
addiu $t3,$zero,6 #high==6
la $t7, myName #gets base address of myName
for_loop:
bgt $s0, $t3, for_loop_done #if i>high, go to for_loop_done to exit the loop
jal isVowel #jump to procedure isVowel
bne $v0, $zero, swap #compare the return value to 0, if not 0, call swap procedure.
addi $s0, $s0, 1 #i++
move $a0, $s0
j for_loop #loop again
swap:
addiu $sp,$sp,-8 #stack grows by 24 bytes
sw $ra,4($sp) #save return address
sw $s2,0($sp) #$s2 is used to hold the variable temp
add $t4,$t7,$s1 # myName[j] = myName + j
lbu $s2,0($t4) # temp=myName[j]
add $t5,$t7,$s0 # myName[i] = myName + i
lbu $t6,0($t5) # myName[i]
lbu $s7,0($t4) # myName[j]
move $s7,$t6 # myName[j]= myName[i]
move $t6,$s2 # myName[i] = temp
sb $s7,0($t4)
sb $t6,0($t5)
addi $s0,$s0,1 # i++
addi $s1,$s1,1 # j++
sw $s2,0($sp) #restore
sw $ra,4($sp)
addiu $sp,$sp,8
jr $ra
for_loop_done:
lw $s1,8($sp)
lw $s0,4($sp)
lw $a0,0($sp)
lw $ra,12($sp)
nop # put in breakpoint here to show memory