diff --git a/Tables/tables.c b/Tables/tables.c index 78a0ae8..3d61746 100644 --- a/Tables/tables.c +++ b/Tables/tables.c @@ -4,7 +4,6 @@ #define TAILLE_BUFFER_INSTRUCTIONS (1024) #define TAILLE_MEMOIRE (32) -#define TAILLE_PILE_APPELS (16) #define TAILLE_BANC_REGISTRES (16) @@ -37,12 +36,6 @@ int mem[TAILLE_MEMOIRE]; // Pointeur de base dans la mémoire int ebp = 0; -// Memoire du programme -int pile[TAILLE_PILE_APPELS]; - -// Pointeur de sommet dans la pile d'appel -int esp = 0; - // Flag Z int Z = 0; @@ -84,15 +77,6 @@ int check_registre(int registre) { return registre; } -// Verifie que les limites de la mémoire d'appels ne sont pas franchies -int check_adresse_pile(int adresse) { - if (adresse >= TAILLE_PILE_APPELS || adresse < 0) { - printf("\033[31;01m ERROR : \033[00m Stack error\n"); - exit(2); - } - return adresse; -} - // Verifie que eip ne depasse pas la taille du buffer int check_eip(int eip) { if (eip >= TAILLE_BUFFER_INSTRUCTIONS) { @@ -224,18 +208,16 @@ void execute() { printf("%d@%d\n", registres[check_registre(programme[eip].param1)], programme[eip].param1); } else if (programme[eip].instruction == CALL) { - pile[check_adresse_pile(esp)] = ebp; - esp++; - pile[check_adresse_pile(esp)] = eip + 1; - esp++; - ebp = ebp + programme[eip].param2; - eip = programme[eip].param1 - 1; + mem[check_adresse(ebp + programme[eip].param2)] = ebp; + mem[check_adresse(ebp + programme[eip].param2 + 1)] = eip + 1; + ebp = ebp + programme[eip].param2 + 2; + eip = programme[eip].param1 - 1; } else if (programme[eip].instruction == RET) { - esp--; - eip = pile[check_adresse_pile(esp)] - 1; - esp--; - ebp = pile[check_adresse_pile(esp)]; + int lastebp = ebp; + eip = mem[check_adresse(ebp - 1)] - 1; + ebp = mem[check_adresse(ebp - 2)]; + mem[check_adresse(lastebp - 2)] = mem[check_adresse(lastebp)]; } else if (programme[eip].instruction == STOP) { if (programme[eip].param1 == 0) {