Instructieset en assembly
Met welke instructie wordt een aanroep via een functiepointer in C, „(*fp)(x)”, in RISC-V gewoonlijk uitgevoerd?
- AHet adres van de functie in een register plaatsen en met jalr naar het adres in dat register springen
- BMet jal het adres van de functie als immediate schrijven en springen
- 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.