Почему мой MIPS, на котором запущен мой код, замораживает симулятор Марса?

Выполнение моего кода замораживает Марс.

Сначала в моем сообщении об ошибке говорилось, что моя вторая метка while уже была объявлена, поэтому я изменил ее имя на while2.

Я изменил регистры t во втором цикле while с t0 на t1, создал отдельные целочисленные процедуры печати для отображения обоих массивов, изменил регистр t6 на t7 во втором массиве, чтобы загрузить значение элемента для печати.

Вот что у меня есть на данный момент:

.data
    
    #declaring array with 12 bytes to hold 3 integers
    #myArray: .space 12 #uninitialized
    
    #declaring and initializing a 3 element long array with 100 as value
    #default value of each element is 100
    myArray: .word 100:3 #3 elements long, each element is 100
    myArray2: .word 24:5 #5 elements long, each element is 24
    
    #print a new line
    newLine: .asciiz "\n"
    #main title
    mainTitle: .asciiz "This program displays array elements that have already been initialized when the array was created.\n"
    exitMessage: .asciiz "This is the end. "

.text
    
    #main procedure
    main: 
    
        #displaying main title
        li $v0, 4
        la $a0, mainTitle
        syscall
    
        #calling function to display 3 element array
        jal displayMyArray
        
        jal printNL
        
        #calling function to display 5 element array 
        jal displayMyArray2
    
    #closing statement for main procedure
    li $v0, 10
    syscall
    
    #function to display integer for first array
    printInt1:
        li $v0, 1
        addi $a0, $t6, 0
        syscall
    #closing statement
    jr $ra
    
    #function to display integer for second array
    printInt2:
        li $v0, 1
        move $a0, $t7
        syscall
    #closing statement
    jr $ra
    
    #function to display new line
    printNL:
        li $v0, 4
        la $a0, newLine
        syscall
    #closing statement
    jr $ra
    
    #function to display 3 element array of 100 
    displayMyArray:
        #setting t0 register to value of 0
        addi $t0, $zero, 0
        
        #while loop to display all the elements of myArray
        while:
            #test condition
            beq $t0, 12, exit #if t0 = 12, then break out of while loop
            
            #load current element to register t0
            lw $t6, myArray ($t0)
            
            #updating offset
            addi $t0, $t0, 4
            
            #calling printInt to display current number
            jal printInt1 
            #calling printNL to print new line
            jal printNL
            
            j while #iterator
            
        exit:
            li $v0, 4
            la $a0, exitMessage
            syscall
    #closing statement
    jr $ra
    
    #function to display 5 element array
    displayMyArray2:
        #setting t0 register to value of 0
        addi $t1, $zero, 0
        
        #while loop to display all elements of myArray2
        while2:
            #test condition
            beq $t1, 20, exit2 #if t0 = 20, then break out of while loop
            
            #load current element to register t0
            lw $t7, myArray2 ($t1)
            
            #updating offset 
            addi $t1, $t1, 4
            
            #printing current number
            jal printInt2
            #printing new line
            jal printNL
            
            j while #iterator
        exit2:
            li $v0, 4
            la $a0, exitMessage
            syscall
    #closing statement
    jr $ra

person Khris Davis    schedule 11.07.2020    source источник
comment
Что происходит, когда вы делаете один шаг?   -  person Erik Eidt    schedule 12.07.2020


Ответы (1)


Это не вешает симулятор, у вас бесконечный цикл.

По мере того, как вы делаете один шаг, вы должны заметить, что поток управления испорчен.

Некоторые из ваших функций не возвращаются туда, где должны (когда они делают jr $ra), потому что вы изменили значение $ra с помощью jal без предварительного сохранения $ra.

Когда одна функция, f, вызывает другую функцию, g, используя инструкцию jal, что является правильным средством для вызова функции, этот вызов / jal в g перепрофилирует регистр $ra, поэтому, если вы планировали вернуться из него функции f обратно к вызывающей стороне, вы должны сохранить это значение для дальнейшего использования.

person Erik Eidt    schedule 11.07.2020
comment
Я предполагаю, что функции, которые не возвращаются туда, где они должны, - это все, кроме двух функций драйвера printArray, которые вызываются в main? - person Khris Davis; 12.07.2020
comment
main не подвержен этой проблеме, потому что он выходит с использованием системного вызова 10, а не с помощью $ra. print... функций тоже нет, но displayMyArray.Ns есть. - person Erik Eidt; 12.07.2020