;;----------------------------------------------------------- ;; ;; Exemple de fonctionnement de VCMC 97 ;; ;;----------------------------------------------------------- ;; un calcul de base: A0 = 3 + 4 (vrun '((FENTRY Basic) (ADD A0 3 4) (RTN)) ) ;; un calcul d'expressions constantes ;; en utilisant des registres intermédiaires ;; A0 = (4 + 5 - 2) * (2 + 3) ;; cela devrait donner 35 (vrun '((FENTRY ExpressionAvecRegistres) (MOV A1 4) (MOV A2 5) (ADD A0 A1 A2) ;; A0 = 4 + 5 (MOV A1 2) (SUB A0 A0 A1) ;; A0 = A0 - 2 (MOV A2 A0) ;; sauve le resultat intermediaire (MOV A0 2) ;; A0 = 2 (MOV A1 3) ;; A1 = 3 (ADD A0 A0 A1) ;; A0 = A0 + A1 (MUL A0 A2 A0) ;; A0 = A2 * A0 (RTN)) ) ;; un calcul d'expressions constantes (le meme) ;; avec utilisation de la pile (vrun '((FENTRY ExpressionAvecPile) (PUSH 3) (PUSH 2) (PUSH 2) (PUSH 5) (MOV A0 4) (POP A1) ;; recupere 5 (ADD A0 A0 A1) (POP A1) ;; recupere 2 (SUB A0 A0 A1) (POP A1) ;; recupere 2 (POP A2) ;; recupere 3 (PUSH A0) ;; sauve le résultat intermédiaire (ADD A0 A1 A2) (POP A1) ;; recupere A1 (MUL A0 A0 A1) ;; ouf (RTN)) ) ;; calcul avec branchement ;; si A0 > 0 alors A0 = 2 * 3 sinon A0 = 5 (vrun '((FENTRY Condit1) (MOV A0 8) ;; A0 = 8 (JGE 0 A0 sinon) ;; si 0 >= A0 aller en sinon (MOV MUL A0 2 3) ;; A0 = 2 * 3 (JMP sortieAlors) ;; puis aller en fin de condition sinon (MOV A0 5) sortieAlors (RTN)) ) ;; une boucle: calcul de factorielle pour les n premiers ;; entiers de manière itérative. ;; n est défini dans A0 (vrun '((FENTRY fact1) (MOV A0 5) ;; calcul de la factorielle de 5 (MOV A2 A0) ;; A2 contient la borne de la boucle (MOV A1 1) (MOV A0 A1) ;; on commence l'iteration debut (JGT A1 A2 finBoucle) ;; si A1 est superieur a A2 on sort de la boucle (MUL A0 A0 A1) (ADD A1 A1 1) ;; A1 = A1 + 1 (JMP debut) finBoucle (RTN)) ) ;; une procedure: Carre qui donne le carre d'un nombre ;; 5^2 + 4^2 (vrun '((FENTRY procedure1) (MOV A0 5) (JSR carre) (MOV A1 A0) (MOV A0 4) (JSR carre) ;; le carre du carre du nombre (ADD A0 A0 A1) (RTN) carre (FENTRY carre) ;; l'argument se trouve dans A0 (MUL A0 A0 A0) (RTN) ) ) ;; une deuxieme procedure: la somme du carre et de la factorielle iterative ;; comme fact1 utilise toutes les variables, il faut sauver le calcul du ;; du carre sur la pile ;; 5^2 + 5! (vrun '((FENTRY procedure2) (MOV A0 5) (JSR carre) (PUSH A0) ;; on sauvegarde la valeur de A0 (MOV A0 5) (JSR fact1) ;; la factorielle du nombre (POP A1) ;; on recupere la valeur du calcul precedent (ADD A0 A0 A1) ;; et on fait la somme (RTN) carre (FENTRY carre) ;; l'argument se trouve dans A0 (MUL A0 A0 A0) (RTN) fact1 (MOV A2 A0) ;; A2 contient la borne de la boucle (MOV A1 1) (MOV A0 A1) ;; on commence l'iteration debut (JGT A1 A2 finBoucle) ;; si A1 est superieur a A2 on sort de la boucle (MUL A0 A0 A1) (ADD A1 A1 1) ;; A1 = A1 + 1 (JMP debut) finBoucle (RTN) ) ) ;; calcul de la factorielle de maniere recursive ;; (define (fact n) (if (= n 0) 1 (* n (fact (1- n))))) (vrun '((FENTRY calculFact2) (MOV A0 5) (JSR fact2) (RTN) fact2 (JEQ A0 0 fin) (PUSH A0) ;; on sauve la valeur de n (SUB A0 A0 1) ;; A0 = n-1 (JSR fact2) ;; calcul de (fact (1- n)) (POP A1) ;; recupere n (MUL A0 A0 A1) ;; A0 = (* n (fact (1- n))) (RTN) fin (MOV A0 1) (RTN) ) ) ;; manipulation de variables globales ;; B = 3, C = 5 ;; B = B + C et on visualise B (vrun '((DATA (B 3) (C 5)) (FENTRY global1) (MOV A0 (loc B)) (MOV A1 (loc C)) (ADD A0 A0 A1) (MOV (loc B) A0) (RTN) ) ) ;; on visualise l'etat de la memoire (pprint MEM)