Befehlssatz und Assembler

Mit welchem Befehl erfolgt in RISC-V im Allgemeinen ein Aufruf über einen C-Funktionszeiger „(*fp)(x)“?

  1. ADie Funktionsadresse wird in ein Register geladen und mit jalr zur Adresse in diesem Register gesprungen
  2. BMit jal wird die Funktionsadresse als Immediate angegeben und gesprungen
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Welche Aussage gilt für zwei CPUs, die dieselbe Befehlssatzarchitektur (ISA) verwenden?
  2. Welche Eigenschaft einer Load-Store-Architektur wie RISC-V ist richtig?
  3. Welche Eigenschaft des RISC-V-Registers x0 (zero) ist richtig?
  4. Welche Universal-Ganzzahlregister besitzt RISC-V RV32I (der 32-Bit-Basisbefehlssatz für Ganzzahlen)?
  5. Welche Beziehung zwischen Assemblersprache und Maschinensprache ist richtig?