From 1dfc8318bfd594bd265c3ef237eef062d7ce37d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9onie=20Gallois?= Date: Mon, 10 May 2021 14:22:36 +0200 Subject: [PATCH] interpreteur --- Interpreteur/src/instructions.c | 76 ++++++++++++++++----------------- Interpreteur/src/instructions.h | 1 - Interpreteur/src/interpreter.l | 1 - Interpreteur/src/interpreter.y | 4 +- 4 files changed, 39 insertions(+), 43 deletions(-) diff --git a/Interpreteur/src/instructions.c b/Interpreteur/src/instructions.c index 2e78f15..ba3f720 100755 --- a/Interpreteur/src/instructions.c +++ b/Interpreteur/src/instructions.c @@ -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; } diff --git a/Interpreteur/src/instructions.h b/Interpreteur/src/instructions.h index ed45fe3..48eb42a 100644 --- a/Interpreteur/src/instructions.h +++ b/Interpreteur/src/instructions.h @@ -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 diff --git a/Interpreteur/src/interpreter.l b/Interpreteur/src/interpreter.l index 0800272..affccd9 100755 --- a/Interpreteur/src/interpreter.l +++ b/Interpreteur/src/interpreter.l @@ -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); diff --git a/Interpreteur/src/interpreter.y b/Interpreteur/src/interpreter.y index 2def9a5..dd6de70 100755 --- a/Interpreteur/src/interpreter.y +++ b/Interpreteur/src/interpreter.y @@ -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 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