ISA et assembleur

Le code ci-dessus est le début (prologue) d'une fonction. Que fait cette partie ?

addi sp, sp, -16
sw   ra, 12(sp)
sw   s0, 8(sp)
  1. AElle réserve une zone sur la pile et y sauvegarde l'adresse de retour (ra) et s0, sauvegardé par l'appelé
  2. BElle lit sur la pile les arguments ra et s0 de la fonction
  3. CElle libère la pile pour revenir de la fonction
Afficher la réponse et l'explication

Réponse : A. Elle réserve une zone sur la pile et y sauvegarde l'adresse de retour (ra) et s0, sauvegardé par l'appelé

La 1re ligne diminue sp de 16 pour réserver le cadre de pile, la 2e y écrit l'adresse de retour ra, et la 3e s0, sauvegardé par l'appelé. Cette fonction appelant d'autres fonctions, elle doit protéger ra, et utilisant s0, elle doit préserver sa valeur d'origine. L'épilogue en fin de fonction restaure dans l'ordre inverse : « lw s0, 8(sp) », « lw ra, 12(sp) », « addi sp, sp, 16 », « ret ».

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

Autres questions sur ISA et assembleur

  1. Quel est l'avantage d'utiliser un pointeur de cadre (s0/fp en RISC-V) dans une fonction ?
  2. 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 ?
  3. 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 ?
  4. 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 ?
  5. 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) ?