/**
 * Un programme dans notre « assembleur » (langage machine) qui utilise
 * la pile « machine ». Celle-ci est implémentée dans la mémoire à
 * la manière de ce qui est fait dans le programme Pile.java.
 * La mémoire est elle-même divisée en deux parties : la zone des variables
 * statiques, et la zone réservée à la pile.
 *
 * Exercice : implémenter les opérations push/pop pour la pile machine et 
 * réécrire le code en les utilisant.
 *
 * Exercice : abstraire le code, en utilisant une constante entière dont
 * la valeur sera l'adresse de début de la pile dans la mémoire, et une autre
 * qui sera l'adresse de début de la zone des variables statiques. Modifier en
 * conséquence le code de sorte que les accès à la mémoire soient tous
 * indexés via l'une ou l'autre de ces constantes...
 */
public class s3 {
  public static void main(String []a) {
    // i:0, j:1 ; les variables statiques sont en tout début de mémoire
    // 2..101 : la pile ; la pile commence à partir de la case n°2
    int []memoire = new int[2+100];
    int instructionCourante = 1;
    boolean fin = false;
    int sommetDePile = 2; // adresse du début de la pile
    while (!fin) {
      switch(instructionCourante) {
      case 1: // i = 13
        memoire[0] = 13;
        break;
      case 2: // push(i)
        memoire[sommetDePile] = memoire[0];
        sommetDePile++;
        break;
      case 3: // j = pop();
        sommetDePile--;
        memoire[1] = memoire[sommetDePile];
        break;
      case 4: // affiche j
        System.out.println(memoire[1]);
        break;
      case 5:
        fin = true;
        break;
      }
      instructionCourante++;
    }
  }
}