From c9c60001de4ae1f8e379dbc210b7a70a6b2dd934 Mon Sep 17 00:00:00 2001 From: pfaure Date: Fri, 18 Jun 2021 14:14:06 +0200 Subject: [PATCH] =?UTF-8?q?Interpreteur=20se=C3=A9curis=C3=A9=20termin?= =?UTF-8?q?=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tables/tables.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/Tables/tables.c b/Tables/tables.c index a5cf97d..f785036 100644 --- a/Tables/tables.c +++ b/Tables/tables.c @@ -4,6 +4,7 @@ #define TAILLE_BUFFER_INSTRUCTIONS (1024) #define TAILLE_MEMOIRE (64) +#define TAILLE_PILE_APPELS (16) /**************************************************/ @@ -32,6 +33,12 @@ 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; + @@ -57,6 +64,15 @@ int check_adresse(int adresse) { return adresse; } +// 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) { @@ -175,14 +191,18 @@ void execute() { printf("%d@%d\n", mem[check_adresse(ebp + programme[eip].param1)], ebp + programme[eip].param1); } else if (programme[eip].instruction == CALL) { - mem[check_adresse(ebp + programme[eip].param2)] = ebp; - mem[check_adresse(ebp + programme[eip].param2 + 1)] = eip + 1; - ebp = ebp + programme[eip].param2 + 2; + 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; } else if (programme[eip].instruction == RET) { - eip = mem[check_adresse(ebp - 1)] - 1; - ebp = mem[check_adresse(ebp - 2)]; + esp--; + eip = pile[check_adresse_pile(esp)] - 1; + esp--; + ebp = pile[check_adresse_pile(esp)]; } else if (programme[eip].instruction == STOP) { if (programme[eip].param1 == 0) {