2017-03-14 3 views
1

Ich bin keine Expertise in MIPS, sorry. Ich muss einen ganzzahligen Wert zwischen 0 und 5 (0 < n < 5) importieren. Zum Beispiel, wenn der Wert von n> 4 ist, habe ich eine Fehlermeldung errorDimensionMessage und mein Programm startet die Funktion jal dimension, bis der richtige Wert eingegeben wird. Wenn danach ein korrekter Wert (z. B. 3) eingegeben wird, geht das Programm zum Beenden in jal exit.MIPS geschachtelte Funktion das Programm ist aus dem Boden

(Code aktualisiert)

Das Problem ist nach 5 (Fehler) -> 3 (OK) das Programm unten abgesetzt.

.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 

Antwort

2

jal dimension # return to dimension Das ist nicht der richtige Weg ist, um dimension zurück zu springen. Sie möchten stattdessen einen regulären unbedingten Sprung verwenden, d. H. Die J-Anweisung (oder B).

Was passiert jetzt ist, dass jal$ra ändert, um auf die Adresse der Anweisung nach der jal, d. H. Nach dem Ende Ihres Programms. Wenn also jr $ra in dimension ausgeführt wird, springen Sie über das Ende Ihres Programms hinaus, daher erhalten Sie "das Programm wird vom Boden fallengelassen".

+0

Danke Michael. Ich habe den Code mit neasted Funktion aktualisiert aber immer noch nicht Ihre Hilfe. –

+0

Nun, wie ich schon sagte, 'jal' ist nicht die richtige Anweisung hier zu verwenden. Sie sollten einen normalen Sprung verwenden, oder möglicherweise 'jr $ ra'. – Michael

+0

Wenn ich jr $ ra benutze, gehe das Programm wieder zum jal exit, während ich in der Dimension –

Verwandte Themen