Forum: PC-Programmierung Mehrere Funktionsaufrufe in Mips durchführen.


von Markus (Gast)


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

von Markus (Gast)


Lesenswert?

Keiner eine Idee?

von Martin S. (strubi)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.