ISA et assembleur

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 ?

  1. Ara est écrasé par l'appel interne, et la fonction externe ne peut plus revenir à son véritable appelant
  2. BLe CPU sauvegarde automatiquement ra, donc aucun problème ne survient
  3. CLe résultat du calcul est doublé quelle que soit la profondeur de récursion
Afficher la réponse et l'explication

Réponse : A. ra est écrasé par l'appel interne, et la fonction externe ne peut plus revenir à son véritable appelant

Le jal de l'appel récursif écrase ra avec « l'instruction qui suit l'appel interne à la fonction ». Sans sauvegarde, lorsque la fonction externe exécute ret, elle revient à l'intérieur d'elle-même au lieu de son appelant d'origine, ce qui provoque des répétitions ou des dysfonctionnements. C'est pourquoi une fonction qui en appelle d'autres doit sauvegarder ra sur la pile dans son prologue et le restaurer dans son épilogue.

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

Autres questions sur ISA et assembleur

  1. 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 ?
  2. 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 ?
  3. Par combien le résultat t0 de l'instruction RISC-V « slli t0, a0, 3 » multiplie-t-il la valeur de a0 (sans tenir compte du débordement) ?
  4. a0 contient l'adresse de début d'un tableau a de type int (4 octets), et a1 l'indice i. Que charge le code ci-dessus dans a2 ?
  5. Quelle affirmation concernant les architectures où les instructions arithmétiques peuvent utiliser directement des valeurs en mémoire, comme l'instruction x86 « add eax, [rbx] », est correcte ?