ISA et assembleur

Quel est l'avantage d'utiliser un pointeur de cadre (s0/fp en RISC-V) dans une fonction ?

  1. AIl évite d'utiliser un registre supplémentaire, ce qui améliore toujours les performances
  2. BMême si sp change en cours de fonction, les variables locales et arguments peuvent être désignés à distance fixe, et le débogueur peut facilement remonter la chaîne d'appels
  3. CLa zone de pile s'agrandit automatiquement et ne déborde plus
Afficher la réponse et l'explication

Réponse : B. Même si sp change en cours de fonction, les variables locales et arguments peuvent être désignés à distance fixe, et le débogueur peut facilement remonter la chaîne d'appels

Le pointeur de cadre est un registre qui reste fixé sur la position de la pile à l'entrée de la fonction. Même si sp change en cours de route, à cause d'un tableau de taille variable par exemple, les variables locales peuvent être désignées par « tant d'octets depuis fp ». De plus, en sauvegardant l'ancien fp dans chaque cadre, on peut remonter la chaîne d'appels (backtrace). Comme il occupe un registre, il est cependant souvent omis lors de l'optimisation.

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

Autres questions sur ISA et assembleur

  1. 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 ?
  2. 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 ?
  3. 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 ?
  4. 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) ?
  5. 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 ?