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?
- AWeil Blattfunktionen den Befehl ret nicht verwenden
- BWeil die CPU die Rücksprungadresse einer Blattfunktion automatisch auf den Stack legt
- 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.