interpreteur
This commit is contained in:
parent
78c21f45ee
commit
1dfc8318bf
4 changed files with 39 additions and 43 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue