Befehlssatz und Assembler

Der obige Code ist der Anfang (Prolog) einer Funktion. Was geschieht in diesem Teil?

addi sp, sp, -16
sw   ra, 12(sp)
sw   s0, 8(sp)
  1. AEs wird Platz auf dem Stack reserviert und die Rücksprungadresse (ra) sowie das vom Aufgerufenen zu sichernde s0 gesichert
  2. BDie Funktionsargumente ra und s0 werden vom Stack gelesen
  3. CDer Stack wird freigegeben, um aus der Funktion zurückzukehren
Antwort und Erläuterung anzeigen

Antwort: A. Es wird Platz auf dem Stack reserviert und die Rücksprungadresse (ra) sowie das vom Aufgerufenen zu sichernde s0 gesichert

Zeile 1 verringert sp um 16 und reserviert den Stackframe, Zeile 2 schreibt die Rücksprungadresse ra und Zeile 3 das vom Aufgerufenen zu sichernde s0 in den Frame. Die Funktion ruft andere Funktionen auf und muss daher ra schützen, und da sie s0 verwendet, auch dessen ursprünglichen Wert. Im Epilog am Funktionsende wird in umgekehrter Reihenfolge zurückgekehrt: „lw s0, 8(sp)“, „lw ra, 12(sp)“, „addi sp, sp, 16“, „ret“.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Welchen Vorteil hat die Verwendung eines Framepointers (bei RISC-V s0/fp) in einer Funktion?
  2. Was geschieht bei RISC-V, wenn in einer sich selbst aufrufenden rekursiven Funktion vergessen wird, ra auf dem Stack zu sichern?
  3. 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“?
  4. Was kann geschehen, wenn bei RISC-V die Adresse des lw-Befehls, der 4 Byte liest, kein Vielfaches von 4 ist (nicht ausgerichtet)?
  5. Um das Wievielfache des Werts von a0 ist t0 nach dem RISC-V-Befehl „slli t0, a0, 3“ größer (Überlauf nicht beachtet)?