Befehlssatz und Assembler

In der RISC-V-Aufrufkonvention sind t0 bis t6 „vom Aufrufer gesichert“ (caller-saved). Welches Vorgehen ist richtig, wenn eine Funktion einen in t0 abgelegten Wert auch nach dem Aufruf einer anderen Funktion weiterverwenden will?

  1. ANichts ist nötig, die aufgerufene Funktion stellt t0 stets wieder her
  2. Bt0 kann von anderen Funktionen nicht überschrieben werden und ist unverändert nutzbar
  3. CDer Wert von t0 wird vor dem Aufruf z. B. auf den Stack gerettet und nach dem Aufruf wiederhergestellt
Antwort und Erläuterung anzeigen

Antwort: C. Der Wert von t0 wird vor dem Aufruf z. B. auf den Stack gerettet und nach dem Aufruf wiederhergestellt

t-Register darf die aufgerufene Funktion frei verwenden, ohne sie zu sichern. Wird der Wert auch nach dem Aufruf gebraucht, muss ihn die aufrufende Seite daher selbst retten. Teilt man die Verantwortung für das Sichern je Register auf Aufrufer und Aufgerufenen auf, können viele Funktionen temporäre Register ohne Sicherungsaufwand nutzen, und die Gesamtzahl der Sicherungen und Wiederherstellungen sinkt.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Bei Funktionen, die keine anderen Funktionen aufrufen (Blattfunktionen, Leaf-Funktionen), muss ra oft nicht auf dem Stack gesichert werden. Welche Begründung ist richtig?
  2. Welchen Zweck hat die Ausführung von „addi sp, sp, -16“ am Anfang einer RISC-V-Funktion?
  3. In der Standard-Aufrufkonvention von RISC-V muss der Stackpointer sp beim Betreten einer Funktion auf ein Vielfaches von 16 Byte ausgerichtet sein. Welche Begründung passt am besten?
  4. Der obige Code ist der Anfang (Prolog) einer Funktion. Was geschieht in diesem Teil?
  5. Welchen Vorteil hat die Verwendung eines Framepointers (bei RISC-V s0/fp) in einer Funktion?