Befehlssatz und Assembler

Welchen Vorteil hat die Verwendung eines Framepointers (bei RISC-V s0/fp) in einer Funktion?

  1. ADa kein zusätzliches Register verbraucht wird, steigt die Leistung stets
  2. BAuch wenn sich sp mitten in der Funktion ändert, lassen sich lokale Variablen und Argumente mit festem Abstand ansprechen, und Debugger können die Aufrufkette leichter verfolgen
  3. CDer Stackbereich wächst automatisch und läuft nicht mehr über
Antwort und Erläuterung anzeigen

Antwort: B. Auch wenn sich sp mitten in der Funktion ändert, lassen sich lokale Variablen und Argumente mit festem Abstand ansprechen, und Debugger können die Aufrufkette leichter verfolgen

Der Framepointer ist ein Register, das auf die Stackposition beim Betreten der Funktion zeigt und sich nicht bewegt. Auch wenn sich sp mittendrin ändert, z. B. bei Arrays variabler Länge, lassen sich lokale Variablen als „so viele Byte von fp“ angeben. Wird in jedem Frame der vorherige fp gesichert, ergibt das Verfolgen die Aufrufkette (Backtrace). Da jedoch ein Register belegt wird, entfällt er bei Optimierungen oft.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Was geschieht bei RISC-V, wenn in einer sich selbst aufrufenden rekursiven Funktion vergessen wird, ra auf dem Stack zu sichern?
  2. 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“?
  3. Was kann geschehen, wenn bei RISC-V die Adresse des lw-Befehls, der 4 Byte liest, kein Vielfaches von 4 ist (nicht ausgerichtet)?
  4. Um das Wievielfache des Werts von a0 ist t0 nach dem RISC-V-Befehl „slli t0, a0, 3“ größer (Überlauf nicht beachtet)?
  5. In a0 steht die Anfangsadresse eines Arrays a vom Typ int (4 Byte), in a1 der Index i. Was lädt der obige Code in a2?