Befehlssatz und Assembler
Mit welchem Befehl erfolgt in RISC-V im Allgemeinen ein Aufruf über einen C-Funktionszeiger „(*fp)(x)“?
- ADie Funktionsadresse wird in ein Register geladen und mit jalr zur Adresse in diesem Register gesprungen
- BMit jal wird die Funktionsadresse als Immediate angegeben und gesprungen
- CMit beq wird die Funktionsadresse verglichen und bei Gleichheit gesprungen
Antwort und Erläuterung anzeigen
Antwort: A. Die Funktionsadresse wird in ein Register geladen und mit jalr zur Adresse in diesem Register gesprungen
Das Ziel eines Funktionszeigers steht erst zur Laufzeit fest, daher ist jal, das das Ziel im Befehl angibt, nicht verwendbar. Stattdessen wird der Zeigerwert in ein Register geladen und mit „jalr ra, 0(t0)“ zur Adresse im Register gesprungen, die Rücksprungadresse bleibt in ra. Auch Aufrufe virtueller C++-Funktionen oder von Funktionen in Shared Libraries sind ähnliche indirekte Aufrufe. Da sich das Ziel ändert, sagt die CPU es mit einem Prädiktor für indirekte Sprünge voraus.