Interpreteur seécurisé terminé
This commit is contained in:
parent
9c38352e61
commit
c9c60001de
1 changed files with 25 additions and 5 deletions
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#define TAILLE_BUFFER_INSTRUCTIONS (1024)
|
#define TAILLE_BUFFER_INSTRUCTIONS (1024)
|
||||||
#define TAILLE_MEMOIRE (64)
|
#define TAILLE_MEMOIRE (64)
|
||||||
|
#define TAILLE_PILE_APPELS (16)
|
||||||
|
|
||||||
|
|
||||||
/**************************************************/
|
/**************************************************/
|
||||||
|
@ -32,6 +33,12 @@ int mem[TAILLE_MEMOIRE];
|
||||||
// Pointeur de base dans la mémoire
|
// Pointeur de base dans la mémoire
|
||||||
int ebp = 0;
|
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;
|
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
|
// Verifie que eip ne depasse pas la taille du buffer
|
||||||
int check_eip(int eip) {
|
int check_eip(int eip) {
|
||||||
if (eip >= TAILLE_BUFFER_INSTRUCTIONS) {
|
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);
|
printf("%d@%d\n", mem[check_adresse(ebp + programme[eip].param1)], ebp + programme[eip].param1);
|
||||||
|
|
||||||
} else if (programme[eip].instruction == CALL) {
|
} else if (programme[eip].instruction == CALL) {
|
||||||
mem[check_adresse(ebp + programme[eip].param2)] = ebp;
|
pile[check_adresse_pile(esp)] = ebp;
|
||||||
mem[check_adresse(ebp + programme[eip].param2 + 1)] = eip + 1;
|
esp++;
|
||||||
ebp = ebp + programme[eip].param2 + 2;
|
pile[check_adresse_pile(esp)] = eip + 1;
|
||||||
|
esp++;
|
||||||
|
ebp = ebp + programme[eip].param2;
|
||||||
eip = programme[eip].param1 - 1;
|
eip = programme[eip].param1 - 1;
|
||||||
|
|
||||||
} else if (programme[eip].instruction == RET) {
|
} else if (programme[eip].instruction == RET) {
|
||||||
eip = mem[check_adresse(ebp - 1)] - 1;
|
esp--;
|
||||||
ebp = mem[check_adresse(ebp - 2)];
|
eip = pile[check_adresse_pile(esp)] - 1;
|
||||||
|
esp--;
|
||||||
|
ebp = pile[check_adresse_pile(esp)];
|
||||||
|
|
||||||
} else if (programme[eip].instruction == STOP) {
|
} else if (programme[eip].instruction == STOP) {
|
||||||
if (programme[eip].param1 == 0) {
|
if (programme[eip].param1 == 0) {
|
||||||
|
|
Loading…
Reference in a new issue