2017-03-14 1 views
1

私はMIPSの専門家ではありません。 0と5の間の整数値をインポートする必要があります(0 < n < 5)。たとえば、nの値が> 4の場合、エラーメッセージerrorDimensionMessageが表示され、正しい値が入力されるまで、プログラムはjal dimensionの機能を再開します。その後、正しい値(たとえば3)を入力すると、プログラムはjal exitに入り、終了します。MIPSのネストされた関数プログラムは最下位に落ちます

(コード更新)

問題が5(エラー)の後であるが - > 3(OK)プログラムは、底部を脱落されます。 dimensionに戻ってジャンプするための正しい方法ではありません

.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 

答えて

2

jal dimension # return to dimension。代わりに通常の無条件ジャンプ、つまりJ命令(またはB)を使用したいとします。

今のところ、jalは、jalに続く命令のアドレス、つまりプログラムの最後を指すように$raを変更します。だからjr $radimensionが実行されると、あなたはプログラムの最後を過ぎてジャンプするので、なぜが「プログラムは一番下に落とされますか」となります。

+0

ありがとう、マイケル。私はneasted関数を使用してコードを更新しましたが、まだあなたの助けをクリアしていません。 –

+0

まあ、私が言ったように、 'jal'はここで使う正しい指示ではありません。通常のジャンプ、あるいはおそらく 'jr $ ra'を使うべきです。 – Michael

+0

私がjr $ raを使うと、プログラムはjal出口に戻りますが、私は次元 –

関連する問題