ISA et assembleur
En RISC-V, quelle instruction réalise généralement un appel par pointeur de fonction en C, « (*fp)(x) » ?
- APlacer l'adresse de la fonction dans un registre et sauter à cette adresse avec jalr
- BSauter avec jal en écrivant l'adresse de la fonction comme immédiat
- CComparer avec beq l'adresse de la fonction et sauter si elles sont égales
Afficher la réponse et l'explication
Réponse : A. Placer l'adresse de la fonction dans un registre et sauter à cette adresse avec jalr
La cible d'un pointeur de fonction n'étant connue qu'à l'exécution, jal, qui inscrit la destination dans l'instruction, est inutilisable. On charge donc la valeur du pointeur dans un registre, on saute à l'adresse de ce registre avec par exemple « jalr ra, 0(t0) », et l'adresse de retour reste dans ra. Les appels de fonctions virtuelles C++ et de fonctions de bibliothèques partagées sont des appels indirects similaires. La destination variant, le CPU la prédit à l'aide d'un prédicteur de branchements indirects.