Mehrere Funktionsaufrufe in Mips durchführen.

Gast #5681706
Lesenswert?
• ▲
▼
Hey,
ich habe gerade das Problem, dass ich eine Funktion habe, die Werte in 
andere  drei andere Funktionen zur Berechnung senden soll, dies wird 
alles in einer schleife passieren müssen.

Meine Frage wäre nun, wie stelle ich dies am besten an ohne mir das ra 
Register dauernd zu überschreiben?

Die Idee wäre:

loop:

...Code

addi $sp,$sp,-4    # Pointer auf den Stack
sw $ra,($sp)       # Speicherung der aktuellen Adresse aufm Stack

jal Funktion 1     # Aufruf der Funktion 1
move $t1,$v1       # Speicherung des übergebenen Wertes


lw $ra, ($sp)      # Wiederherstellung der alten return Adresse
addi $sp,$sp,4     # POP


...Code

End_loop:
jr $ra

So, nun will man damit arbeiten und es funktioniert ohne Probleme, auch 
in der Schleife.

Problematisch wird es, wenn man eine zweite und dritte Funktion aufrufen 
will, hier scheint sich alles zu überschreiben.
Leider bin ich noch unerfahren mit den Stacks hier, was muss man machen 
damit man nach dem ersten Aufruf der FKT1 noch einen zweiten und dritten 
von zwei weiteren Funktionen implementieren kann, ohne dass sich alles 
überschreibt?


Danke im Voraus
#5689002
Lesenswert?
• ▲
▼
Dein Ansatz ist schon korrekt. Wenn dir nicht irgend eine nachfolgende 
funktion den Stack versaut, sollte es auch so passen.
Tip: mal mit "mips-elf-objdump -S elffile" o.ä. ein compiliertes 
C-Programm in Assembler ausgeben. Oder gleich qemu-mips und GDB 
anwerfen, da lässt sich beim Single-Steppen viel lernen. Für 
Windows-User gibt's da auch fertige Entwicklungssysteme als 
Docker-container, ich poste jetzt mal keine Links, da die Auswahl recht 
gross ist.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.