fakultät rekursiv programmieren mit MISP /SPIM

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • fakultät rekursiv programmieren mit MISP /SPIM

    Hallo,

    Aufgabe ist es Fakultät mit SPIM rekursiv zu programmieren. eigentich nich so schwer, trotzdem weis ich jetzt nicht mehr weiter
    Folgendes hab ich gemacht: Gibt leider immer 4 aus, ich find einfach den Fehler nicht. Vielleicht kann mir wer helfen.

    Quellcode

    1. .data
    2. eingabe: .asciiz "Geben Sie eine Zahl ein: "
    3. ausgabe: .asciiz "Ergebnis: "
    4. .text
    5. main: la $a0, eingabe # "Geben Sie eine Zahl ein: " ausgeben
    6. li $v0, 4
    7. syscall
    8. li $v0, 5 # Zahl einlesen
    9. syscall
    10. move $t0, $v0 # Eingabe sichern, $t0:=$v0, das heißt meine Eingabe steckt jetzt in $t0
    11. move $a0, $t0 # in $a0 steckt mein Argument für den Prozeduraufruf, meine Eingabe
    12. jal fak # Fakultäts- Prozedur aufrufen
    13. la $a0, ausgabe # "Ergebnis: " ausgeben
    14. li $v0, 4
    15. syscall
    16. move $a0, $v0 # $a0:=$v0 (in $v0 ist das Funktionsergebnis meiner Prozedur)
    17. li $v0, 1 # Integer in $a0 wird ausgeben
    18. syscall
    19. li $v0, 10 # terminieren
    20. syscall
    21. fak: addi $sp, $sp -8 # $sp dekrementieren, auf dem Stack Platz für 2 Register machen
    22. sw $ra, 8($sp) # $ra liegt auf dem erstem freien Platz, Rücksprungadresse wird auf den Stack gelegt
    23. sw $a0, 4($sp) # $a0 liegt auf dem zweitem freien Platz, übergebenes Argument wird auf den Stack gelegt
    24. bltz $a0, negativeZahl # n($a0) < 0
    25. beqz $a0, null # n($a0) == 0
    26. bgtz $a0, else # n($a0) > 0
    27. addi $v0, $zero, 1 #
    28. addi $sp, $sp, 8 # $sp wieder inkrementieren
    29. jr $ra
    30. negativeZahl: li $v0, -1 # return -1
    31. jr $ra # jr ermöglicht den Sprung an eine erst zur Laufzeit ermittelte Stelle im Programm; $ra enthält nach Aufruf des Befehls jal die Rücksprungadresse
    32. null: li $v0, 1 # return 1
    33. jr $ra # jr ermöglicht den Sprung an eine erst zur Laufzeit ermittelte Stelle im Programm; $ra enthält nach Aufruf des Befehls jal die Rücksprungadresse
    34. else: sub $a0, $a0, 1 # $a0:=$a0 - 1, n - 1
    35. jal fak # rekursiver Aufruf mit $a -1 (n-1)
    36. lw $ra, 8($sp)
    37. lw $a0, 4($sp)
    38. addi $sp, $sp, 8
    39. mul $v0, $v0, $a0 # $v0:=$v0 * $a0, n * (n - 1) #??? ist das hier richtig? muss ich die multiplikation nicht vielleicht vor dem rekursiven aufruf haben? damit auch jedes n, n-1, -2 mitmultipliziert wird?
    40. jr $ra
    Alles anzeigen


    Vielen Dank wenn jemand mir meinen Fehler sagen kann und ob das mit der Multiplikation stimmt
    Danke