interpreteur

This commit is contained in:
Leonie Gallois 2021-05-10 14:22:36 +02:00
parent 78c21f45ee
commit 1dfc8318bf
4 changed files with 39 additions and 43 deletions

View file

@ -15,10 +15,11 @@ int has_error;
int memory[MAX_MEMORY_SIZE]; int memory[MAX_MEMORY_SIZE];
int memory_fonc[MAX_MEMORY_SIZE]; int memory_fonc[MAX_MEMORY_SIZE];
int ESP=0;
int EBP=0; int EBP=0;
int INDEX_memory_fonc=0; int INDEX_memory_fonc=0;
int pop(){ int pop_memory_fonc(){
int res; int res;
if(INDEX_memory_fonc >0){ if(INDEX_memory_fonc >0){
res=memory_fonc[INDEX_memory_fonc]; res=memory_fonc[INDEX_memory_fonc];
@ -30,7 +31,7 @@ int pop(){
return res; return res;
} }
void push(int arg){ void push_memory_fonc(int arg){
if (INDEX_memory_fonc < MAX_MEMORY_SIZE){ if (INDEX_memory_fonc < MAX_MEMORY_SIZE){
INDEX_memory_fonc ++; INDEX_memory_fonc ++;
memory_fonc[INDEX_memory_fonc]=arg; memory_fonc[INDEX_memory_fonc]=arg;
@ -134,78 +135,77 @@ int exec(int ip) {
// execute inst // execute inst
switch (ins) { switch (ins) {
case ADD: case ADD:
printf("ADD @%d = @%d[%d] + @%d[%d]\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("ADD @%d = @%d[%d] + @%d[%d]\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] + memory[arg3]; memory[arg1+EBP] = memory[arg2+EBP] + memory[arg3+EBP];
break; break;
case MUL: case MUL:
printf("MUL @%d = @%d[%d] * @%d[%d]\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("MUL @%d = @%d[%d] * @%d[%d]\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] * memory[arg3]; memory[arg1+EBP] = memory[arg2+EBP] * memory[arg3+EBP];
break; break;
case SOU: case SOU:
printf("SOU @%d = @%d[%d] - @%d[%d]\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("SOU @%d = @%d[%d] - @%d[%d]\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] - memory[arg3]; memory[arg1+EBP] = memory[arg2+EBP] - memory[arg3+EBP];
break; break;
case DIV: case DIV:
printf("DIV @%d = @%d[%d] / @%d[%d]\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("DIV @%d = @%d[%d] / @%d[%d]\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] / memory[arg3]; memory[arg1+EBP] = memory[arg2+EBP] / memory[arg3+EBP];
break; break;
case COP: case COP:
printf("COP @%d = @%d[%d]\n", arg1, arg2, memory[arg2]); printf("COP @%d = @%d[%d]\n", arg1, arg2, memory[arg2+EBP]);
memory[arg1] = memory[arg2]; memory[arg1+EBP] = memory[arg2+EBP];
break; break;
case AFC: case AFC:
printf("AFC @%d = %d\n", arg1, arg2); printf("AFC @%d = %d\n", arg1, arg2);
memory[arg1] = arg2; memory[arg1+EBP] = arg2;
ESP+=1;
break; break;
case JMP: case JMP:
printf("JMP to %d\n", arg1); printf("JMP to %d\n", arg1);
next_ip = arg1; next_ip = arg1;
break; break;
case JMF: case JMF:
printf("JMF cond@%d[%d] to %d\n", arg1, memory[arg1], arg2); printf("JMF cond@%d[%d] to %d\n", arg1, memory[arg1+EBP], arg2);
if (memory[arg1] == 0) next_ip = arg2; if (memory[arg1+EBP] == 0) next_ip = arg2;
break; break;
case INF: case INF:
printf("INF @%d = @%d[%d] < @%d[%d] ? 1 : 0\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("INF @%d = @%d[%d] < @%d[%d] ? 1 : 0\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] < memory[arg3] ? 1 : 0; memory[arg1+EBP] = memory[arg2+EBP] < memory[arg3+EBP] ? 1 : 0;
break; break;
case SUP: case SUP:
printf("SUP @%d = @%d[%d] > @%d[%d] ? 1 : 0\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("SUP @%d = @%d[%d] > @%d[%d] ? 1 : 0\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] > memory[arg3] ? 1 : 0; memory[arg1+EBP] = memory[arg2+EBP] > memory[arg3+EBP] ? 1 : 0;
break; break;
case EQU: case EQU:
printf("EQU @%d = @%d[%d] == @%d[%d] ? 1 : 0\n", arg1, arg2, memory[arg2], arg3, memory[arg3]); printf("EQU @%d = @%d[%d] == @%d[%d] ? 1 : 0\n", arg1, arg2, memory[arg2+EBP], arg3, memory[arg3+EBP]);
memory[arg1] = memory[arg2] == memory[arg3] ? 1 : 0; memory[arg1+EBP] = memory[arg2+EBP] == memory[arg3+EBP] ? 1 : 0;
break; break;
case PRI: case PRI:
printf("PRI @%d[%d]\n", arg1, memory[arg1]); printf("PRI @%d[%d]\n", arg1, memory[arg1+EBP]);
break; break;
case AFCA: case AFCA:
printf("AFCA @%d[%d] = @%d[%d]\n", arg1, memory[arg1], arg2+EBP, memory[arg2]+EBP); printf("AFCA @[%d] = %d\n", arg1, arg2+EBP);
memory[arg1]=memory[arg2]+EBP; memory[arg1]=arg2+EBP;
ESP+=1;
break; break;
case WR: case WR:
printf("WR @%d[%d] = @%d[%d] \n", memory[arg1+EBP], memory[memory[arg1+EBP]], arg2+EBP, memory[arg2+EBP] ); printf("WR @[@%d](%d) = @%d[%d] \n", arg1, memory[arg1], arg2, memory[arg2] );
memory[memory[arg1+EBP]]=memory[arg2+EBP]; memory[memory[arg1]]=memory[arg2];
break; break;
case READ: case READ:
printf("READ @%d[%d] = @%d\n", arg1, memory[arg1], memory[memory[arg1+EBP]]); printf("READ @%d = @%d(%d)\n", arg1, memory[arg1],memory[memory[arg1]]);
memory[arg1]=memory[memory[arg1+EBP]]; memory[arg1]=memory[memory[arg1]];
break;
case COPR:
printf("COPR @ebp-%d = @%d[%d]\n", arg2, arg1, memory[arg1]);
memory[EBP-arg2]=memory[arg1];
break; break;
case CALL: case CALL:
printf("CALL memory_fonc: adr_ret=%d; context (ebp)=%d \njump to function to line %d\n", arg3, EBP, arg1); printf("CALL memory_fonc: adr_ret=%d; context (ebp)=%d \njump to function to line %d\n", arg3, EBP, arg1);
push(arg3); push_memory_fonc(arg3);
push(EBP); push_memory_fonc(EBP);
EBP+=arg2; EBP=ESP+1;
next_ip=arg1; next_ip=arg1;
break; break;
case RET: case RET:
EBP=pop(); ESP=EBP-1;
next_ip=pop(); EBP=pop_memory_fonc();
next_ip=pop_memory_fonc();
printf("RET return to line %d \nand update ebp to %d\n", next_ip, EBP); printf("RET return to line %d \nand update ebp to %d\n", next_ip, EBP);
break; break;
default: default:
@ -214,6 +214,6 @@ int exec(int ip) {
printf("memory_fonc\n"); printf("memory_fonc\n");
print_stack(memory_fonc, INDEX_memory_fonc); print_stack(memory_fonc, INDEX_memory_fonc);
printf("memory\n"); printf("memory\n");
print_stack(memory, 11); print_stack(memory, ESP);
return next_ip; return next_ip;
} }

View file

@ -18,7 +18,6 @@
#define READ 15 #define READ 15
#define RET 16 #define RET 16
#define CALL 17 #define CALL 17
#define COPR 18
#define MAX_INSTRUCTIONS_SIZE 256 #define MAX_INSTRUCTIONS_SIZE 256
#define MAX_MEMORY_SIZE 256 #define MAX_MEMORY_SIZE 256

View file

@ -23,7 +23,6 @@ WR {return tWR;}
READ {return tREAD;} READ {return tREAD;}
RET {return tRET;} RET {return tRET;}
CALL {return tCALL;} CALL {return tCALL;}
COPR {return tCOPR;}
-?[0-9]+ { -?[0-9]+ {
yylval.nb = atoi(yytext); yylval.nb = atoi(yytext);

View file

@ -12,7 +12,7 @@
int nb; int nb;
} }
%token tADD tMUL tSOU tDIV tCOP tAFC tJMP tJMF tINF tSUP tEQU tPRI tAFCA tWR tREAD tCOPR tCALL tRET %token tADD tMUL tSOU tDIV tCOP tAFC tJMP tJMF tINF tSUP tEQU tPRI tAFCA tWR tREAD tCALL tRET
%token <nb> tNB %token <nb> tNB
@ -59,8 +59,6 @@ Instruction:
{asm_add_2(WR, $2, $3);} {asm_add_2(WR, $2, $3);}
| tREAD tNB tNB | tREAD tNB tNB
{asm_add_2(READ, $2, $3);} {asm_add_2(READ, $2, $3);}
| tCOPR tNB tNB
{asm_add_2(COPR, $2, $3);}
| tCALL tNB tNB tNB | tCALL tNB tNB tNB
{asm_add_3(READ, $2, $3, $4);} {asm_add_3(READ, $2, $3, $4);}
| tRET | tRET