Befehlssatz und Assembler

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?

  1. AWeil das Betriebssystem nicht startet, wenn die Stackgröße kein Vielfaches von 16 Byte ist
  2. BWeil die unteren 4 Bit von sp die Funktionsnummer aufnehmen
  3. CWeil auch große Daten bis 16 Byte auf dem Stack effizient gelesen und geschrieben werden können, ohne Grenzen zu überschreiten
Antwort und Erläuterung anzeigen

Antwort: C. Weil auch große Daten bis 16 Byte auf dem Stack effizient gelesen und geschrieben werden können, ohne Grenzen zu überschreiten

Daten, die an Adressen liegen, die Vielfache ihrer Größe sind (Ausrichtung), lassen sich mit einem Zugriff lesen und schreiben, ohne Grenzen zu überschreiten. Ist sp stets ein Vielfaches von 16, bleibt die Ausrichtung auch bei 8 Byte großen double oder 16 Byte großen long double auf dem Stack erhalten. Daher reservieren Funktionen die Framegröße als Vielfaches von 16 und verwenden auch für ein einziges zu sicherndes Register „addi sp, sp, -16“.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Der obige Code ist der Anfang (Prolog) einer Funktion. Was geschieht in diesem Teil?
  2. Welchen Vorteil hat die Verwendung eines Framepointers (bei RISC-V s0/fp) in einer Funktion?
  3. Was geschieht bei RISC-V, wenn in einer sich selbst aufrufenden rekursiven Funktion vergessen wird, ra auf dem Stack zu sichern?
  4. 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“?
  5. Was kann geschehen, wenn bei RISC-V die Adresse des lw-Befehls, der 4 Byte liest, kein Vielfaches von 4 ist (nicht ausgerichtet)?