diff --git a/consts.c b/consts.c index efb7fc7..4a9d776 100644 --- a/consts.c +++ b/consts.c @@ -1,6 +1,6 @@ #ifndef CONSTS #define CONSTS -#define VERSION 2 +#define VERSION 3 #endif /* ifndef CONSTS #define CONSTS diff --git a/instruktion.c b/instruktion.c index d86a68f..015d2c4 100644 --- a/instruktion.c +++ b/instruktion.c @@ -22,5 +22,17 @@ #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 +#define CALL 26 +#define RET 27 +#define DROP 28 #endif /* ifndef INSREUKTION */ diff --git a/njvm.c b/njvm.c index c3561bb..98e3c36 100644 --- a/njvm.c +++ b/njvm.c @@ -7,9 +7,8 @@ #include "codeReader.c" #include "SDA.c" -//Comment to disable debug - -#define DEBUG + // Debug +int debug = 1; // Stack struct stack stack; @@ -38,81 +37,136 @@ void execute(struct program program) { for (i = 0; i < *program.size; ++i) { switch (program.program[i] >> 24) { case HALT: + if(debug == 1) printf("halt\n"); goto end; case PUSHC: + if(debug == 1) printf("pushc\n"); push(stack, SIGN_EXTEND(IMMEDIATE(program.program[i]))); break; case ADD: + if(debug == 1) printf("add\n"); push(stack, pop(stack) + pop(stack)); break; case SUB: + if(debug == 1) printf("sub\n"); temp = pop(stack); push(stack, pop(stack) - temp); break; case MUL: + if(debug == 1) printf("mul\n"); push(stack, pop(stack) * pop(stack)); break; case DIV: + if(debug == 1) printf("div\n"); temp = pop(stack); push(stack, pop(stack) / temp); break; case MOD: + if(debug == 1) printf("mod\n"); temp = pop(stack); push(stack, pop(stack) % temp); break; case RDINT: + if(debug == 1) printf("rdint\n"); scanf("%i", &intInput); push(stack, intInput); break; case WRINT: + if(debug == 1) printf("wrint\n"); printf("%i", pop(stack)); break; case RDCHR: + if(debug == 1) printf("rdchr\n"); scanf("%c", &charInput); push(stack, charInput); break; case WRCHR: + if(debug == 1) printf("wrchr\n"); printf("%c", pop(stack)); break; case PUSHG: + if(debug == 1) printf("pushg\n"); push(stack, getSDA(SIGN_EXTEND(IMMEDIATE(program.program[i])), sda)); break; case POPG: + if(debug == 1) printf("popg\n"); setSDA(SIGN_EXTEND(IMMEDIATE(program.program[i])), pop(stack), sda); break; case ASF: + if(debug == 1) printf("asf\n"); push(stack, *stack.current); fp = *stack.current - 1; *stack.current = *stack.current + SIGN_EXTEND(IMMEDIATE(program.program[i])); break; case RSF: + if(debug == 1) printf("rsf\n"); *stack.current = fp + 2; fp = pop(stack); case POPL: + if(debug == 1) printf("popl\n"); stack.stack[fp + SIGN_EXTEND(IMMEDIATE(program.program[i]))] = pop(stack); break; case PUSHL: + if(debug == 1) printf("pushl\n"); push(stack, stack.stack[fp + SIGN_EXTEND(IMMEDIATE(program.program[i]))]); break; + case NE: + if(debug == 1) printf("ne\n"); + if (pop(stack) != pop(stack)) push(stack, 1); + else push(stack, 0); + break; + case EQ: + if(debug == 1) printf("eq\n"); + if (pop(stack) == pop(stack)) push(stack, 1); + else push(stack, 0); + break; + case LT: + if(debug == 1) printf("lt\n"); + temp = pop(stack); + if (pop(stack) < temp) push(stack, 1); + else push(stack, 0); + break; + case LE: + if(debug == 1) printf("le\n"); + temp = pop(stack); + if (pop(stack) <= temp) push(stack, 1); + else push(stack, 0); + break; + case GT: + if(debug == 1) printf("gt\n"); + temp = pop(stack); + if (pop(stack) > temp) push(stack, 1); + else push(stack, 0); + break; + case GE: + if(debug == 1) printf("ge\n"); + temp = pop(stack); + if (pop(stack) >= temp) push(stack, 1); + else push(stack, 0); + break; + case BRF: + if(debug == 1) printf("brf\n"); + if(pop(stack)==0) + i = SIGN_EXTEND(IMMEDIATE(program.program[i])); + break; + case BRT: + if(debug == 1) printf("brt\n"); + if(pop(stack)==1) + i = SIGN_EXTEND(IMMEDIATE(program.program[i])); + case JMP: + if(debug == 1) printf("jmp\n"); + i = SIGN_EXTEND(IMMEDIATE(program.program[i])); + break; } } end: return; } -#ifdef DEBUG void tests(void) { - printf("Runnig debug mode\n"); - int temp = fromFile("./prog1.bin", program); - int sizeSDA = temp; - unsigned int s[sizeSDA]; - sda.size = &temp; - sda.sda = s; - printProgram(program); + } -#endif /* ifdef DEBUG */ - int main(int argc, char *argv[]) { // Initialize the Stack int size = SIZE; @@ -130,8 +184,11 @@ int main(int argc, char *argv[]) { program.program = p; program.saveProgram = &saveProgram; - int debug = 0; - + if (argc > 2) { + if (strcmp(argv[2], "--debug")) { + debug = 1; + } + } if (debug){ tests(); } diff --git a/programs/nja b/programs/nja index ffb2771..1ed10bf 100755 Binary files a/programs/nja and b/programs/nja differ diff --git a/programs/prog4.asm b/programs/prog4.asm new file mode 100644 index 0000000..b9e89b5 --- /dev/null +++ b/programs/prog4.asm @@ -0,0 +1,61 @@ +// +// prog1.asm -- an assembler example with global variables +// + +// +// compute the gcd of two positive numbers +// +// global Integer x; +// global Integer y; +// x = readInteger(); +// y = readInteger(); +// while (x != y) { +// if (x > y) { +// x = x - y; +// } else { +// y = y - x; +// } +// } +// writeInteger(x); +// writeCharacter('\n'); + + // x = readInteger(); + rdint + popg 0 + // y = readInteger(); + rdint + popg 1 + // while ... +L1: + // x != y + pushg 0 + pushg 1 + ne + brf L2 + // if ... + pushg 0 + pushg 1 + gt + brf L3 + // x = x - y + pushg 0 + pushg 1 + sub + popg 0 + jmp L4 +L3: + // y = y - x + pushg 1 + pushg 0 + sub + popg 1 +L4: + jmp L1 +L2: + // writeInteger(x); + pushg 0 + wrint + // writeCharacter('\n'); + pushc '\n' + wrchr + halt diff --git a/programs/prog4.bin b/programs/prog4.bin new file mode 100644 index 0000000..da8f524 Binary files /dev/null and b/programs/prog4.bin differ diff --git a/programs/prog5.asm b/programs/prog5.asm new file mode 100644 index 0000000..2361a26 --- /dev/null +++ b/programs/prog5.asm @@ -0,0 +1,63 @@ +// +// prog2.asm -- an assembler example with local variables +// + +// +// compute the gcd of two positive numbers +// +// local Integer x; +// local Integer y; +// x = readInteger(); +// y = readInteger(); +// while (x != y) { +// if (x > y) { +// x = x - y; +// } else { +// y = y - x; +// } +// } +// writeInteger(x); +// writeCharacter('\n'); + + asf 2 + // x = readInteger(); + rdint + popl 0 + // y = readInteger(); + rdint + popl 1 + // while ... +L1: + // x != y + pushl 0 + pushl 1 + ne + brf L2 + // if ... + pushl 0 + pushl 1 + gt + brf L3 + // x = x - y + pushl 0 + pushl 1 + sub + popl 0 + jmp L4 +L3: + // y = y - x + pushl 1 + pushl 0 + sub + popl 1 +L4: + jmp L1 +L2: + // writeInteger(x); + pushl 0 + wrint + // writeCharacter('\n'); + pushc '\n' + wrchr + rsf + halt diff --git a/programs/prog5.bin b/programs/prog5.bin new file mode 100644 index 0000000..36d2c44 Binary files /dev/null and b/programs/prog5.bin differ diff --git a/programs/prog6.asm b/programs/prog6.asm new file mode 100644 index 0000000..b9e89b5 --- /dev/null +++ b/programs/prog6.asm @@ -0,0 +1,61 @@ +// +// prog1.asm -- an assembler example with global variables +// + +// +// compute the gcd of two positive numbers +// +// global Integer x; +// global Integer y; +// x = readInteger(); +// y = readInteger(); +// while (x != y) { +// if (x > y) { +// x = x - y; +// } else { +// y = y - x; +// } +// } +// writeInteger(x); +// writeCharacter('\n'); + + // x = readInteger(); + rdint + popg 0 + // y = readInteger(); + rdint + popg 1 + // while ... +L1: + // x != y + pushg 0 + pushg 1 + ne + brf L2 + // if ... + pushg 0 + pushg 1 + gt + brf L3 + // x = x - y + pushg 0 + pushg 1 + sub + popg 0 + jmp L4 +L3: + // y = y - x + pushg 1 + pushg 0 + sub + popg 1 +L4: + jmp L1 +L2: + // writeInteger(x); + pushg 0 + wrint + // writeCharacter('\n'); + pushc '\n' + wrchr + halt