Instructieset en assembly

Met welke instructie wordt een aanroep via een functiepointer in C, „(*fp)(x)”, in RISC-V gewoonlijk uitgevoerd?

  1. AHet adres van de functie in een register plaatsen en met jalr naar het adres in dat register springen
  2. BMet jal het adres van de functie als immediate schrijven en springen
  3. CMet beq het adres van de functie vergelijken en springen als ze gelijk zijn
Antwoord en toelichting tonen

Antwoord: A. Het adres van de functie in een register plaatsen en met jalr naar het adres in dat register springen

Waar een functiepointer naar wijst, is pas tijdens uitvoering bekend, dus jal, waarbij het doel in de instructie staat, kan niet worden gebruikt. Daarom wordt de pointerwaarde in een register gelezen en met bijvoorbeeld „jalr ra, 0(t0)” naar het adres in het register gesprongen, terwijl het terugkeeradres in ra achterblijft. Ook aanroepen van virtuele functies in C++ en van functies in gedeelde bibliotheken zijn dergelijke indirecte aanroepen. Omdat het doel varieert, voorspelt de CPU het doel met een voorspeller voor indirecte sprongen.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Instructieset en assembly

  1. Welke uitspraak over twee CPU's met dezelfde instructiesetarchitectuur (ISA) is juist?
  2. Welke eigenschap van een load-store-architectuur zoals RISC-V is juist?
  3. Welke eigenschap van het RISC-V-register x0 (zero) is juist?
  4. Welke algemene gehele-getalregisters heeft RISC-V RV32I (de basisinstructieset voor gehele getallen van 32 bits)?
  5. Welke relatie tussen assembleertaal en machinecode is juist?