Функция обмена MIPS зашла в бесконечный цикл

Я пишу функцию перемещения гласных 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++;
        }
    }
}

Код MIPS для функции moveVowelsToBeginning:

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

Почему вы предоставляете перевод сборки? Вам нужно самостоятельно переводить код C в ассемблер?

Gabriel Devillers 17.12.2018 20:02

Что ж, инструкции sw в конце функции swap явно неверны. Хотя не похоже, что swap действительно нужно что-то сохранять и восстанавливать; он не модифицирует $ra, а $s2 не используется в функции окружения (moveVowelsToBeginning).

Michael 18.12.2018 10:21

Кроме того, выполнение jr $ra внутри swap неверно, так как вы не использовали jal. И в зависимости от того, куда вы собираетесь вернуться после завершения swap, увеличение i внутри swap также может быть неправильным.

Michael 18.12.2018 10:25

@ Майкл, спасибо. Вы правы, $ ra не изменялся. Я изменил jr $ ra на j for_loop, и это сработало.

Chris.Zhou 18.12.2018 15:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
82
0

Другие вопросы по теме