diff --git a/instruktion.c b/instruktion.c index d86a68f..7c30044 100644 --- a/instruktion.c +++ b/instruktion.c @@ -22,5 +22,14 @@ #define RSF 14 #define PUSHL 15 #define POPL 16 +#define EQ 17 +#define NE 18 +#define LT 19 +#define LE 20 +#define GT 21 +#define GE 22 +#define JMP 23 +#define BRF 24 +#define BRT 25 #endif /* ifndef INSREUKTION */ diff --git a/njvm.c b/njvm.c index 11b4251..6e2e41c 100644 --- a/njvm.c +++ b/njvm.c @@ -112,6 +112,37 @@ void execute(struct program *program, struct sda *sda) { currentFrame = stack.frames[stack.currentFrame]; currentFrame->fp[SIGN_EXTEND(IMMEDIATE(instruction))] = pop(&stack); break; + case EQ: + push(&stack,pop(&stack)==pop(&stack)); + break; + case NE: + push(&stack,pop(&stack)!=pop(&stack)); + break; + case LT: + push(&stack, pop(&stack)pop(&stack)); + break; + case GE: + push(&stack,pop(&stack)>=pop(&stack)); + break; + case JMP: + i = SIGN_EXTEND(IMMEDIATE(instruction)); + break; + case BRF: + if (pop(&stack)==0){ + i = SIGN_EXTEND(IMMEDIATE(instruction)); + } + break; + case BRT: + if (pop(&stack)==1){ + i = SIGN_EXTEND(IMMEDIATE(instruction)); + } + break; } } diff --git a/program.c b/program.c index 5b48b41..b2a8dd9 100644 --- a/program.c +++ b/program.c @@ -75,6 +75,30 @@ void printProgram(struct program *program) { case POPL: strcpy(c, "popl"); break; + case EQ: + strcpy(c,"eq"); + break; + case NE: + strcpy(c,"ne"); + break; + case LT: + strcpy(c,"lt"); + break; + case GT: + strcpy(c,"gt"); + break; + case GE: + strcpy(c,"ge"); + break; + case JMP: + strcpy(c,"jmp"); + break; + case BRF: + strcpy(c, "brf"); + break; + case BRT: + strcpy(c,"brt"); + break; default: strcpy(c, "ERROR"); break;