Befehlssatz und Assembler

Bei Funktionen, die keine anderen Funktionen aufrufen (Blattfunktionen, Leaf-Funktionen), muss ra oft nicht auf dem Stack gesichert werden. Welche Begründung ist richtig?

  1. AWeil Blattfunktionen den Befehl ret nicht verwenden
  2. BWeil die CPU die Rücksprungadresse einer Blattfunktion automatisch auf den Stack legt
  3. CWeil keine anderen Funktionen aufgerufen werden, ra nicht überschrieben wird und die Rücksprungadresse unverändert erhalten bleibt
Antwort und Erläuterung anzeigen

Antwort: C. Weil keine anderen Funktionen aufgerufen werden, ra nicht überschrieben wird und die Rücksprungadresse unverändert erhalten bleibt

ra wird bei jedem funktionsaufrufenden jal überschrieben, daher muss eine Funktion, die andere Funktionen aufruft, ihre Rücksprungadresse zu Beginn auf dem Stack sichern. Blattfunktionen verwenden kein jal, ra bleibt unverändert, und sie können ohne Sicherung ret ausführen. Verwenden sie zudem keine vom Aufgerufenen gesicherten Register, ist nicht einmal ein Stackframe nötig. Der Befehl call bei x86 legt die Rücksprungadresse stets auf den Stack, was hier ein Unterschied zu RISC-V ist.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Welchen Zweck hat die Ausführung von „addi sp, sp, -16“ am Anfang einer RISC-V-Funktion?
  2. 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?
  3. Der obige Code ist der Anfang (Prolog) einer Funktion. Was geschieht in diesem Teil?
  4. Welchen Vorteil hat die Verwendung eines Framepointers (bei RISC-V s0/fp) in einer Funktion?
  5. Was geschieht bei RISC-V, wenn in einer sich selbst aufrufenden rekursiven Funktion vergessen wird, ra auf dem Stack zu sichern?