Вложенная функция MIPS программа отбрасывается снизу

Я не эксперт в MIPS, извините. Мне нужно импортировать целочисленное значение от 0 до 5 (0 ‹ n ‹ 5). Например, если значение n > 4, у меня появляется сообщение об ошибке errorDimensionMessage, и моя программа перезапускает функцию jal dimension до тех пор, пока не будет введено правильное значение. После этого, если я ввожу правильное значение (например, 3), программа переходит в jal exitдля выхода.

(код обновлен)

Проблема в том, что после 5 (ошибка) -> 3 (ОК) программа сбрасывается снизу.

.data
    InsertDimension: .asciiz " Insert an integer (n) with value between 0 and 5 (0 < n < 5): "
    errorDimensionMessage: .asciiz  " Error. Matrix dimension is not valid (e.g., 0 < n < 5)\n"
    messageExit: .asciiz " Exit...\n"


.text
.globl main
    main:
        jal dimension
        jal exit

   exit: 
        la $a0, messageExit 
        li $v0, 4 # print string
        syscall
        li $v0, 10 # loads the service that exits
        syscall

    dimension:
        move $s0, $ra # save return address into s0
        la $a0, InsertDimension 
        li $v0, 4 # print string
        syscall 
        li $v0, 5 # read an integer from console and put it in $v0!
        syscall
        jal isValidDimension
        move $ra, $s0    #restore return address that was saved into s0
        jr $ra #return

    isValidDimension: 
        move $s1, $s0 # save return address into s0
        beqz $v0, errorDimension
        bgt $v0, 4, errorDimension
        move $s0, $s1 # save return address into s0
        jr $ra #return

    errorDimension:
        la $a0, errorDimensionMessage 
        li $v0, 4 # print string
        syscall
        j dimension # return to dimension

person Gianni Spear    schedule 14.03.2017    source источник


Ответы (1)


jal dimension # return to dimension Это неправильный способ вернуться к dimension. Вместо этого вы хотите использовать обычный безусловный переход, то есть инструкцию J (или B).

Что происходит сейчас, так это то, что jal изменяет $ra, чтобы указать на адрес инструкции, следующей за jal, то есть за концом вашей программы. Итак, когда выполняется jr $ra в dimension, вы перескакиваете за конец своей программы, поэтому вы получаете "программа отбрасывается снизу".

person Michael    schedule 14.03.2017
comment
Спасибо, Майкл. Я обновил код, используя встроенную функцию, но до сих пор не понял вашей помощи. - person Gianni Spear; 14.03.2017
comment
Ну, как я уже сказал, jal здесь не подходит. Вы должны использовать обычный прыжок или, возможно, jr $ra. - person Michael; 14.03.2017
comment
если я использую jr $ra, программа возвращается к выходу jal, а мне нужно вернуться в измерение - person Gianni Spear; 14.03.2017
comment
Затем используйте J или B, как я предложил в своем ответе. JAL изменяет $ra. Если вы не хотите использовать его в качестве побочного эффекта, нет причин использовать его более J/B. - person Michael; 14.03.2017