Cours la machine virtuelle O’Caml, tutoriel & guide de travaux pratiques en pdf.
Description précise des instructions
I CLOSURE o, n : Crée une fermeture (bloc de tag 247) contenant le label correspondant à l’offset o suivi de n éléments d’environnement ôtés de accu+pile. Un pointeur vers cette fermeture est placé dans accu. I CLOSUREREC o1 … ok, n : Si un seul offset o1, cf. CLOSURE+PUSH. Sinon, fabrique la fermeture suivante, en prenant n éléments d’environnement e1 … en dans accu+pile. hdr pc+o1 hdr pc+o2 … hdr pc+ok e1 … en accu reçoit un pointeur vers cette fermeture, et on fait PUSH I PUSH_RETADDR : Empile successivement les valeurs des registres extra_args, env et pc
I APPLY n : accu doit contenir un pointeur vers une fermeture, et la pile doit contenir n arguments suivi d’une zone où sont sauvegardés les pc/env/extra_args courant. Le registre env reçoit accu. Le registre extra_args est positionné à n-1. Le point d’exécution pc saute au label dans la fermeture. I APPLY1 … APPLY3 : cf APPLY, sauf que ces variantes sauvent elles-mêmes pc/env/extra_args derrière les arguments : pas besoin de PUSH_RETADDR avant.
I RETURN n : Dans tous les cas, on commence par enlever n éléments obsolètes de la pile. Deux cas viennent ensuite : I Si extra_args vaut 0 : c’est le cas usuel d’une fonction ayant reçu exactement assez d’arguments. On termine la fonction en enlevant de la pile trois éléments de plus, qui servent à restaurer respectivement les registres pc/env/extra_args (en particulier saut à pc). I Si extra_args > 0, cela signifie que la fonction courante a retourné dans accu une fermeture, qu’il faut maintenant exécuter sur les arguments restants : on décroit extra_args de 1, env reçoit accu et on saute au code contenu dans cette fermeture (cf. APPLY).