ISA et assembleur

En RISC-V, quelle instruction réalise généralement un appel par pointeur de fonction en C, « (*fp)(x) » ?

  1. APlacer l'adresse de la fonction dans un registre et sauter à cette adresse avec jalr
  2. BSauter avec jal en écrivant l'adresse de la fonction comme immédiat
  3. 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.

S'entraîner sur ce thème Retour au thème

Autres questions sur ISA et assembleur

  1. Quelle affirmation concernant deux CPU adoptant la même architecture de jeu d'instructions (ISA) est correcte ?
  2. Quelle caractéristique d'une architecture load-store comme RISC-V est correcte ?
  3. Quelle propriété du registre x0 (zero) de RISC-V est correcte ?
  4. Quels sont les registres entiers à usage général de RV32I (jeu d'instructions entières de base 32 bits) de RISC-V ?
  5. Quelle relation entre langage assembleur et langage machine est correcte ?