ISA et assembleur

La convention d'appel standard de RISC-V exige que le pointeur de pile sp soit un multiple de 16 octets à l'entrée d'une fonction. Quelle en est la raison la plus pertinente ?

  1. AParce que l'OS ne démarre pas si la capacité de la pile n'est pas un multiple de 16 octets
  2. BParce que le numéro de la fonction est enregistré dans les 4 bits de poids faible de sp
  3. CPour que des données de grande taille, jusqu'à 16 octets, placées sur la pile puissent être lues et écrites efficacement sans franchir de frontière
Afficher la réponse et l'explication

Réponse : C. Pour que des données de grande taille, jusqu'à 16 octets, placées sur la pile puissent être lues et écrites efficacement sans franchir de frontière

Une donnée placée à une adresse multiple de sa taille (alignée) peut être lue ou écrite en un seul accès sans franchir de frontière. En maintenant sp toujours multiple de 16, l'alignement est préservé même pour un double de 8 octets ou un long double de 16 octets placé sur la pile. Les fonctions réservent donc des cadres dont la taille est un multiple de 16, et utilisent « addi sp, sp, -16 » même pour un seul registre à sauvegarder.

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

Autres questions sur ISA et assembleur

  1. Le code ci-dessus est le début (prologue) d'une fonction. Que fait cette partie ?
  2. Quel est l'avantage d'utiliser un pointeur de cadre (s0/fp en RISC-V) dans une fonction ?
  3. En RISC-V, que se passe-t-il si l'on oublie de sauvegarder ra sur la pile en écrivant une fonction récursive qui s'appelle elle-même ?
  4. Sur un RISC-V little-endian, un registre contenant 0x12345678 est écrit à l'adresse 0x100 avec « sw ». Si l'on lit ensuite avec « lbu » l'octet à l'adresse 0x101, quelle est sa valeur ?
  5. En RISC-V, si l'adresse d'une instruction lw lisant 4 octets n'est pas un multiple de 4 (non alignée), que peut-il se passer ?