Befehlssatz und Assembler

Welchen Zweck hat die Ausführung von „addi sp, sp, -16“ am Anfang einer RISC-V-Funktion?

  1. ADen Stack zu kleineren Adressen hin wachsen zu lassen und einen Arbeitsbereich von 16 Byte zu reservieren
  2. B16 Byte auf dem Stack freizugeben
  3. C16 vom Wert in sp abzuziehen und als Rückgabewert zurückzugeben
Antwort und Erläuterung anzeigen

Antwort: A. Den Stack zu kleineren Adressen hin wachsen zu lassen und einen Arbeitsbereich von 16 Byte zu reservieren

Nach der Konvention vieler ISAs einschließlich RISC-V wächst der Stack von höheren zu niedrigeren Adressen. Wird sp um 16 verringert, bilden die 16 Byte vom neuen sp bis zum ursprünglichen sp den Stackframe dieser Funktion, in dem Rücksprungadresse, gesicherte Register und lokale Variablen abgelegt werden können. Am Ende der Funktion wird sp mit „addi sp, sp, 16“ zurückgesetzt, der Bereich freigegeben und der Zustand vor dem Aufruf wiederhergestellt.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. 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?
  2. Der obige Code ist der Anfang (Prolog) einer Funktion. Was geschieht in diesem Teil?
  3. Welchen Vorteil hat die Verwendung eines Framepointers (bei RISC-V s0/fp) in einer Funktion?
  4. Was geschieht bei RISC-V, wenn in einer sich selbst aufrufenden rekursiven Funktion vergessen wird, ra auf dem Stack zu sichern?
  5. Bei Little-Endian-RISC-V wurde ein Register mit 0x12345678 per „sw“ an die Adresse 0x100 geschrieben. Welchen Wert liefert danach das Lesen des Bytes an Adresse 0x101 mit „lbu“?