2017-03-24 3 views
0

Ich versuche einen einfachen Assembler-Code zu erstellen, der eine Eingabe N akzeptiert und die N-te Fibonacci-Nummer zurückgibt (z. B. wenn Sie 2 eingeben, sollte es 1 ausgeben und wenn Sie 3 eingeben) Ausgang 2). Mein Code wirft keine Fehler, aber nachdem Sie eine Zahl eingegeben haben, gibt es etwas seltsam zurück. Wenn Sie 1 eingeben, wird 2685009921 zurückgegeben. Wenn Sie 2 eingeben, wird 0.01 zurückgegeben. Wenn Sie 3 eingeben, wird 0.02 zurückgegeben. Wenn Sie 4 eingeben, wird der Text am Anfang ausgegeben und nach einer positiven Ganzzahl gefragt. Geben Sie dann 3 (die richtige Antwort) ein. Wenn Sie 5 eingeben, wird nichts ausgegeben, und wenn Sie erneut die Eingabetaste drücken, wird eine Laufzeitausnahme ausgegeben (ungültige Ganzzahleingabe syscall 5). Alles über fünf gibt seltsame Fehler.Einfache MIPS-Assembly - Rückgabe einer Fibonacci-Nummer

Es ist fast so, als ob es einen Syscall mit der Eingangsnummer als Code ausführt, was erklären würde, warum die ersten vier Zahlen Dinge ausgeben (die ersten vier syscalls geben Daten aus).

Was denkst du? Hier ist der Code:

.data 
    introText: .asciiz "Type a positive integer, please! \n" 
    input: .word 123 


.text 
    # ask user for input 
    li $v0, 4 
    la $a0, introText 
    syscall 

    # read input int 
    li $v0, 5 
    syscall 

    # store input 
    addi $s1, $v0, 0 
    syscall 

    # main loop 
    li $s2, 0 # s2 starts at 0 and will increase until it's equal to $s1, the player input 
    li $s3, 0 # this will hold the most recent fib number 
    li $s4, 1 # this will hold the second most recent fib number 
    loop: 
    addi $s2, $s2, 1 # increment s2 for loop 
    add $s5, $s3, $s4 # make the current result the sum of the last two fib numbers 
    addi, $s4, $s3, 0 # make the second most recent fib number equal to the most recent fib number 
    addi, $s3, $s5, 0 # make the most recent fib number equal to the current fib number 
    bne $s2, $s1, loop 

    # return the answer 
    li $v0, 1 
    addi $a0, $s5, 0 
    syscall 

    # end program 
    li $v0, 10 
    syscall 

Antwort

0

Aus irgendeinem Grund eine syscall nach addi $s1, $v0, 0 platziert haben. Diese Anweisung sollte nicht da sein.

+0

Danke, dass es behoben! – BowmanBeric

Verwandte Themen