Comment compiler la création d'un tableau (new T[e]) en XVM ?
Compiler new T[e] : allouer un bloc de e+1 mots dans le tas et initialiser le mot 0 avec la taille e.
Compiler new T[e] : allouer un bloc de e+1 mots dans le tas et initialiser le mot 0 avec la taille e.
Calculer e, copier sa valeur (FETCH(0)), ajouter 1, appeler ALLOC, sauvegarder l'adresse (PXR), écrire la taille à l'offset 0 (CWRITE), puis remettre l'adresse en sommet de pile.
Cherche chaque exercice au brouillon, puis coche “valider” si tu as trouvé la bonne démarche. Utilise le bouton aide si tu as besoin d'un coup de pouce.
Compiler new int[3] : créer un tableau de 3 entiers.
Calculer la taille 3, la copier, ajouter 1 et allouer :
PUSH(3) -- pile : [3] (taille e=3)
FETCH(0) -- pile : [3, 3] (copie de la taille)
PUSH(1) -- pile : [1, 3, 3]
ADD -- pile : [4, 3] (taille du bloc = 3+1 = 4)
ALLOC -- pile : [addr, 3] (addr = adresse du bloc de 4 mots)
Sauvegarder l'adresse et écrire la taille à l'offset 0 :
PXR -- R <- addr ; pile : [3]
PRX -- pile : [3, addr]
PUSH(0) -- pile : [0, addr, 3]
CWRITE -- mem(addr+0) <- 3 ; pile : []
PRX -- pile : [addr] (adresse du tableau en sommet)
L'adresse du tableau de 3 entiers est en haut de pile. mem(addr)=3, mem(addr+1..addr+3) = cases du tableau.
Compiler new int[50] : créer un tableau de 50 entiers.
Compiler new int[n] où n est une variable locale déjà sur la pile (adresse frame offset 2).