Befehlssatz und Assembler

Was geschieht bei RISC-V, wenn in einer sich selbst aufrufenden rekursiven Funktion vergessen wird, ra auf dem Stack zu sichern?

  1. Ara wird beim inneren Aufruf überschrieben, und die äußere Funktion kann nicht mehr korrekt zum richtigen Aufrufer zurückkehren
  2. BDie CPU sichert ra automatisch, daher entsteht kein Problem
  3. CUnabhängig von der Rekursionstiefe verdoppelt sich das Rechenergebnis
Antwort und Erläuterung anzeigen

Antwort: A. ra wird beim inneren Aufruf überschrieben, und die äußere Funktion kann nicht mehr korrekt zum richtigen Aufrufer zurückkehren

Das jal des rekursiven Aufrufs überschreibt ra mit „dem Befehl nach dem Aufruf in der Funktion selbst“. Ohne Sicherung kehrt die äußere Funktion bei ret nicht zum ursprünglichen Aufrufer, sondern in sich selbst zurück, wiederholt dieselbe Stelle oder arbeitet fehlerhaft. Daher gilt als Regel, dass eine Funktion, die andere Funktionen aufruft, ra im Prolog auf dem Stack sichert und im Epilog wiederherstellt.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. 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“?
  2. Was kann geschehen, wenn bei RISC-V die Adresse des lw-Befehls, der 4 Byte liest, kein Vielfaches von 4 ist (nicht ausgerichtet)?
  3. Um das Wievielfache des Werts von a0 ist t0 nach dem RISC-V-Befehl „slli t0, a0, 3“ größer (Überlauf nicht beachtet)?
  4. 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?
  5. Welche Aussage zu Verfahren ist richtig, bei denen Rechenbefehle wie „add eax, [rbx]“ bei x86 Werte im Speicher direkt verwenden können?