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

View file

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

View file

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

View file

@ -12,7 +12,7 @@
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
@ -59,8 +59,6 @@ Instruction:
{asm_add_2(WR, $2, $3);}
| tREAD tNB tNB
{asm_add_2(READ, $2, $3);}
| tCOPR tNB tNB
{asm_add_2(COPR, $2, $3);}
| tCALL tNB tNB tNB
{asm_add_3(READ, $2, $3, $4);}
| tRET