Compare commits

...

125 Commits

Author SHA1 Message Date
nilspolek
221a08e7dc testing 2024-01-28 10:54:17 +01:00
nilspolek
84dcb63ea7 testing 2024-01-28 10:51:57 +01:00
nilspolek
958c383f85 changed objref to prevent bugs 2024-01-28 10:30:39 +01:00
nilspolek
f3829559d4 null problems are now not more 2024-01-28 00:14:19 +01:00
nilspolek
9155216fd2 now breakpoints are possible 2024-01-27 23:29:33 +01:00
nilspolek
b6320ecba7 updated the test 2024-01-27 23:21:18 +01:00
nilspolek
3bd8b9ac20 updated the test 2024-01-27 23:20:25 +01:00
root
147415beef s 2024-01-27 22:14:18 +00:00
nilspolek
5fb42ff984 updated the test 2024-01-27 23:09:29 +01:00
nilspolek
d7bb53687d updated the test 2024-01-27 23:08:21 +01:00
root
ee27de7481 factor.asm 2024-01-27 22:01:18 +00:00
root
eaab6ab023 s 2024-01-27 21:55:35 +00:00
nilspolek
38f06b1575 updated the test 2024-01-27 22:52:29 +01:00
nilspolek
6ebc065a7a added a method for testing arrays 2024-01-27 22:43:34 +01:00
nilspolek
8c45b02769 added njvm2 2024-01-27 21:19:57 +01:00
nilspolek
4cc117fdd4 added tests 2024-01-27 21:18:34 +01:00
nilspolek
49e4911238 added tests 2024-01-27 21:17:06 +01:00
nilspolek
21c1f8fee6 made some updates 2024-01-27 20:53:05 +01:00
root
30311a393d s 2024-01-27 19:36:30 +00:00
root
daacbc705d added njc8l 2024-01-27 19:33:56 +00:00
nilspolek
b77ea3d3d8 made some updates 2024-01-27 20:11:56 +01:00
nilspolek
29dc364f94 made some updates 2024-01-27 20:01:28 +01:00
nilspolek
fd15e54cdd made some updates 2024-01-27 19:59:01 +01:00
nilspolek
460def3fc6 made some updates 2024-01-27 18:53:42 +01:00
nilspolek
4cf1a82974 made some updates 2024-01-27 18:52:39 +01:00
nilspolek
bc56a6a1c2 made some updates 2024-01-27 18:51:14 +01:00
nilspolek
84320f00c7 made some updates 2024-01-27 18:49:59 +01:00
nilspolek
8d667ec836 removed sda from stack.c 2024-01-27 18:45:27 +01:00
nilspolek
520cfa57d5 removed sda from stack.c 2024-01-27 18:32:29 +01:00
nilspolek
2df1debe1a removed sda from stack.c 2024-01-27 18:31:36 +01:00
nilspolek
9475dd6666 changed version 2024-01-27 18:27:57 +01:00
nilspolek
03b88a8a76 added some things to GC 2024-01-27 10:25:27 +01:00
nilspolek
91b36a53d5 changed stack size 2024-01-26 19:13:42 +01:00
nilspolek
169217fd2c changed stack size 2024-01-26 17:01:07 +01:00
084b715729 testing sth 2024-01-25 20:22:33 +00:00
7d2e5ad1cd made some improvements 2024-01-25 19:51:24 +00:00
nilspolek
08109a4f16 changed stack size 2024-01-23 22:49:23 +01:00
nilspolek
ade4f8e18d changed version 2024-01-23 22:46:55 +01:00
nilspolek
9f7cd4aefc forgot what ive done 2024-01-23 22:45:49 +01:00
nilspolek
82704187f9 Arrays work now 2024-01-23 22:15:49 +01:00
nilspolek
4f0fc8a364 Arrays work now 2024-01-23 22:05:23 +01:00
nilspolek
797bfa45eb corrected CMakeLists.txt 2024-01-23 21:44:03 +01:00
nilspolek
1c0d85b5c9 added sth 2024-01-23 21:10:06 +01:00
nilspolek
dc5a98c401 added sth 2024-01-23 20:04:06 +01:00
nilspolek
c174108e09 fixed some mistakes 2024-01-23 17:18:54 +01:00
nilspolek
e8b4062331 added some sht 2024-01-23 16:58:57 +01:00
nilspolek
f0d74a7e17 forgotten to add new in instructions.c 2024-01-23 16:03:04 +01:00
nilspolek
1ea539ddea removed the fib program 2024-01-23 15:49:05 +01:00
nilspolek
69b4a1afb4 Added some instructions for cmp 2024-01-23 15:47:43 +01:00
nilspolek
3a046d6f89 Added some instructions for cmp 2024-01-23 15:41:31 +01:00
eba9656631 sjkbdsfjk 2024-01-18 21:07:59 +01:00
nils polek
f60e82b46b Chanded versin 2024-01-18 19:56:11 +00:00
1f02f49cdf fix comparisons 2024-01-18 20:18:21 +01:00
nils polek
6319ddcad9 some shit 2024-01-18 19:15:56 +00:00
9b4a9faa8d update version to 6 2024-01-18 18:54:53 +01:00
4d24ab038c remove unused tmp variable 2024-01-18 18:54:20 +01:00
82d3201374 add bigint to execute 2024-01-18 18:53:46 +01:00
e5f2858a5c update 2024-01-18 18:25:16 +01:00
906ea30be2 update 2024-01-18 18:25:00 +01:00
nils polek
70dbd0253b Big int works 2024-01-18 17:17:07 +00:00
5039f95153 Revert "update"
This reverts commit dbafdbeea5.
2024-01-18 17:24:01 +01:00
dbafdbeea5 update 2024-01-18 16:21:34 +01:00
nils polek
ac57431ac4 added big int lib 2024-01-15 16:28:41 +00:00
nils polek
3935d2778b alle rechenobjekte im stack sind jetzt pointer 2024-01-15 15:32:02 +00:00
nils polek
37843d9356 Added a debug menue 2024-01-15 12:43:49 +00:00
nils polek
6cc2ff87ca Stack uses only references and equation objects 2024-01-15 11:48:21 +00:00
nils polek
f29f500d0c added some shit 2024-01-14 20:09:51 +00:00
nils polek
23e787eb5e added pushr popr 2024-01-14 17:39:11 +00:00
nils polek
94fb404c71 Added nja njc and Makefile 2024-01-14 17:11:09 +00:00
847f68bb29 fix error 2023-12-28 22:29:30 +01:00
da06afd43b update version to 8 2023-12-28 22:28:35 +01:00
9421d34756 add heap and stack args (not yet implemented) 2023-12-28 22:25:40 +01:00
Nils Polek
60bdfd7843 Added DUB 2023-12-10 00:24:17 +01:00
bdb0ce63b8 fix dfbnjkhghjdfsbg 2023-12-10 00:18:20 +01:00
dcb665f5a6 update debug 2023-12-10 00:00:59 +01:00
Nils Polek
82dc5f28cc abc 2023-12-09 23:43:33 +01:00
8be99c5244 update debug 2023-12-09 23:15:11 +01:00
742f050b24 update debug 2023-12-09 23:14:19 +01:00
14025d3b08 update debug 2023-12-09 23:12:33 +01:00
3f12378110 update debug 2023-12-09 23:11:42 +01:00
2cb94eaf76 update debug 2023-12-09 23:10:31 +01:00
9d64b87a09 update debug 2023-12-09 23:10:23 +01:00
b87ebbe841 update debug 2023-12-09 23:03:32 +01:00
829735eb8c update debug 2023-12-09 22:57:26 +01:00
44f70a1777 update debug 2023-12-09 22:51:27 +01:00
5a7338f91c update debug 2023-12-09 22:49:44 +01:00
a8999f4ec2 update debug 2023-12-09 22:43:53 +01:00
c0a5e694c0 update debug
fix call not jumping
2023-12-09 22:42:46 +01:00
Nils Polek
61a138fdee versin v 2023-12-09 22:40:18 +01:00
55af679c39 fix jump not working right 2023-12-09 22:10:02 +01:00
27400289f5 update debug 2023-12-09 22:00:13 +01:00
c0d25212af fix printProgram 2023-12-09 21:56:17 +01:00
10a6883750 update debug mode 2023-12-09 21:55:12 +01:00
Nils Polek
33a2994c29 Commit with mistake 2023-12-09 21:40:42 +01:00
Nils Polek
7390df9ee0 Aufgabe 2 Fertig 2023-12-09 20:35:15 +01:00
Nils Polek
83dae77e31 aufgabe 2 stack overflow 2023-12-09 19:45:15 +01:00
nils polek
fb8497fbee changed path 2023-12-03 19:39:50 +01:00
dc16504cd7 Aufgabe 2 fertig 2023-12-03 19:30:38 +01:00
2a427a2563 Aufgabe 2 fertig 2023-12-03 18:19:39 +01:00
0e52973475 Aufgabe 2 fertig 2023-12-03 18:14:27 +01:00
nils polek
8b3770df80 added codeReader and consts.c 2023-12-03 16:10:33 +01:00
dc33e46e24 update help 2023-12-03 14:59:02 +01:00
c900a0444f fix printing negative numbers 2023-12-03 14:29:07 +01:00
c16fe6349b add error message if no program selected
fix error with negative numbers
2023-12-03 14:24:22 +01:00
1363db7c11 Finished cleaning up the code 2023-10-30 12:51:42 +01:00
dfedf2e717 test 2023-10-30 11:59:56 +01:00
4d547cca6a #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "instruktion.c"
#include "code.c"
#include "stack.c"

//Comment to disable debug

// #define DEBUG

// Stack
struct stack stack;
#define SIZE 1000

unsigned int* programmSpeicher;

void copyToProgramm(unsigned int codeToCopy[]){
  programmSpeicher = codeToCopy;
}

void version(void) {
    printf("Ninja Virtual Machine version %i (compiled %s, %s)\n", 0, __DATE__, __TIME__);
}

void help(void) {
    printf("usage: ./njvm [option] [option] ...\n\t--version\tshow version and exit\n\t--help\t\tshow this help and exit\n");
}
void printProgramm(){
  int i = 0;
  char c[10];
  while (programmSpeicher[i] != 0)
  {
    switch (programmSpeicher[i] >> 24) {
      case PUSHC:
        strcpy(c,"pushc");
      break;
      case ADD:
        strcpy(c,"add");
      break;
      case SUB:
        strcpy(c,"sub");
      break;
      case MUL:
        strcpy(c,"mul");
      break;
      case DIV:
        strcpy(c,"div");
      break;
      case MOD:
        strcpy(c,"mod");
      break;
      case RDINT:
        strcpy(c,"rdint");
      break;
      case WRINT:
        strcpy(c,"wrint");
      break;
      case RDCHR:
        strcpy(c,"rdchr");
      break;
      case WRCHR:
        strcpy(c,"wrchr");
      break;
      default:
        strcpy(c,"halt");
      break;
    }
    IMMEDIATE(programmSpeicher[i])? printf("%03i:\t%s\t%i\n",i,c,IMMEDIATE(programmSpeicher[i])) : printf("%03i:\t%s\n",i,c);
       i++;
  }
  printf("%03i:\thalt\n",i);
}
void execute(void) {
    int i = 0;
    int intInput;
    int temp;
    char charInput;
    while (1) {

        switch (programmSpeicher[i] >> 24) {
            case HALT:
                  goto end;
                break;
            case PUSHC:
                  push(stack,IMMEDIATE(programmSpeicher[i]));
                break;
            case ADD:
                  push(stack,pop(stack)+pop(stack));
                break;
            case SUB:
                  temp = pop(stack);
                  push(stack,pop(stack) - temp);
                break;
            case MUL:
                  push(stack,pop(stack)*pop(stack));
                break;
            case DIV:
                  temp = pop(stack);
                  push(stack,pop(stack)/temp);
                break;
            case MOD:
                  temp = pop(stack);
                  push(stack,pop(stack)%temp);
                break;
            case RDINT:
                  scanf("%i",&intInput);
                  push(stack,intInput);
                break;
            case WRINT:
                  printf("%i",pop(stack));
                break;
            case RDCHR:
                  scanf("%c",&charInput);
                  push(stack,charInput);
                break;
            case WRCHR:
                  printf("%c",pop(stack));
                break;
        }
        i++;
    }
end:
  return;
}
#ifdef DEBUG

void tests(void){
  printf("Runnig debug mode\n");
  copyToProgramm(code1);
  printProgramm();
  execute();
}

#endif /* ifdef DEBUG */

int main(int argc, char *argv[]) {
  int size = SIZE;
  int current = 0;
  unsigned int s[SIZE];
  stack.size = &size;
  stack.current = &current;
  stack.stack = s;
    #ifdef DEBUG
      tests();
    #endif /* ifdef DEBUG */
     if (argc > 1) {
        if (strcmp(argv[1], "--version") == 0) {
            version();
        } else if (strcmp(argv[1], "--help") == 0) {
            help();
        } else if (strcmp(argv[1], "--prog1") == 0) {
            copyToProgramm(code1);
            goto run;
        } else if (strcmp(argv[1],"--prog2") == 0) {
            copyToProgramm(code2);
            goto run;
        }else if (strcmp(argv[1],"--prog3") == 0) {
            copyToProgramm(code3);
            goto run;
        }else {
            printf("unknown command line argument '%s', try './njvm --help'", argv[1]);
        }
    } else {
  run:
//    Started
        printf("Ninja Virtual Machine started\n");
        printProgramm();
        execute();
//    Stopped
        printf("Ninja Virtual Machine stopped\n");
        return 0;
    }
}
2023-10-30 00:24:55 +01:00
6740f41edc stack organized 2023-10-30 00:17:17 +01:00
9890324ea5 Structurized the code 2023-10-26 22:36:54 +02:00
efe7663637 Print program 2023-10-26 17:26:59 +02:00
4e629a6ca7 orginized projekt 2023-10-26 14:49:57 +02:00
d947afdf03 Test 2023-10-26 14:03:31 +02:00
d05c415295 Now HALT works correctly 2023-10-22 13:51:32 +02:00
d23727f6da Added the 3 progamms 2023-10-21 21:31:04 +02:00
62ede37645 Operations now work 2023-10-21 21:09:01 +02:00
9f7b69e5f7 Added the option to test and basic math to execute() 2023-10-21 19:14:48 +02:00
nplk84
7d7b67f7f2 Stack overflow errors get detected correctly 2023-10-16 11:56:38 +02:00
nplk84
655da552de Added Keys 2023-10-15 19:08:12 +02:00
4f23944408 fix some warnings 2023-10-15 19:05:43 +02:00
19de6c2dbc remove config.h.in 2023-10-15 19:01:28 +02:00
49b064d74d remove config file
update CMakeLists.txt
update gitignore file
2023-10-15 19:00:46 +02:00
nplk84
119b5be760 deleated some shit 2023-10-15 18:50:37 +02:00
nplk84
23690576ea Added Keys 2023-10-15 18:23:32 +02:00
nplk84
8a7d900d9a Added the Stack 2023-10-12 14:42:31 +02:00
nplk84
1b742e0007 Added the Stack 2023-10-12 12:57:51 +02:00
119 changed files with 35064 additions and 62 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.idea
cmake-build-debug
njvm
njvm.dSYM
njvm.exe

8
.idea/.gitignore generated vendored
View File

@@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ninja.iml" filepath="$PROJECT_DIR$/.idea/ninja.iml" />
</modules>
</component>
</project>

2
.idea/ninja.iml generated
View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -2,11 +2,22 @@ cmake_minimum_required(VERSION 3.0)
project(ninja LANGUAGES C)
set(CMAKE_C_STANDARD 99)
set(PROJECT_VERSION 0)
configure_file(
${CMAKE_SOURCE_DIR}/config.h.in
${CMAKE_BINARY_DIR}/config.h
)
include_directories(${CMAKE_BINARY_DIR})
add_executable(ninja
njvm.c config.h.in)
add_compile_options(-g -Wall -pedantic)
add_executable(njvm njvm.c)
# Include directories for njvm executable
target_include_directories(njvm PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include)
# Add the library
add_library(bigint STATIC ${CMAKE_SOURCE_DIR}/bigint/src/bigint.c
support.c
GC.c)
# Include directories for the bigint library
target_include_directories(bigint PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include)
# Link the executable with the library
target_link_libraries(njvm PRIVATE bigint)

99
GC.c Normal file
View File

@@ -0,0 +1,99 @@
#ifndef GC
#define GC
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stackslot.c"
#include "stack.c"
#include "bigint.h"
#include "instruktion.c"
#include "record.c"
#include "SDA.c"
typedef struct {
unsigned int freiZeiger;
unsigned int size;
unsigned char *data;
} *heapPartRef;
// SDA
struct sda sda;
// Stack
struct stack stack;
#define SIZE 64
//Register
struct stack reg;
//heapPartRef primary;
//heapPartRef secondary;
//unsigned int heapSize;
//void initHeap(int size){
// heapSize = 2 * sizeof (unsigned int) + size;
// if ((primary = malloc(heapSize)) == NULL) perror("malloc");
// if ((secondary = malloc(heapSize)) == NULL) perror("malloc");
//}
//
//
//// nimmt obj und copier es in den secondary Speicher
//void copy(ObjRef obj){
// if(obj->brokenHeart == true) return;
// obj->brokenHeart = true;
// if (IS_PRIMITIVE(obj)){
// if(obj->size > secondary->size-secondary->freiZeiger) perror("Heap is to Small");
// obj->forward_pointer = memcpy((void *) secondary->data[secondary->freiZeiger], obj, obj->size);
// secondary->freiZeiger += obj->size;
// } else {
// if(sizeof(*obj) + (GET_ELEMENT_COUNT(obj) * sizeof(void *)) > secondary->size-secondary->freiZeiger) perror("Heap is to Small");
// GET_ELEMENT_COUNT(obj);
// obj->forward_pointer = memcpy((void *) secondary->data[secondary->freiZeiger], obj, sizeof(*obj) + (GET_ELEMENT_COUNT(obj) * sizeof(void *)));
// secondary->freiZeiger += sizeof(*obj) + (GET_ELEMENT_COUNT(obj) * sizeof(void *));
// for (int i = 0; i < GET_ELEMENT_COUNT(obj); ++i) {
// copy(getField(obj,i));
// }
// }
//}
//
//void runGC(){
// int rootSize = *sda.size + *reg.size + *stack.size + 4;
// ObjRef* rootObjs = malloc(sizeof(ObjRef) * rootSize);
// if(rootObjs == NULL) perror("malloc");
// int counter = 0;
// //Bip
// rootObjs[0] = bip.op1;
// rootObjs[counter++] = bip.op2;
// rootObjs[counter++] = bip.res;
// rootObjs[counter++] = bip.rem;
// //SDA
// for (int i = 0; i < *sda.size; ++i) {
// rootObjs[counter++] = sda.sda[i];
// }
// //REG
// for (int i = 0; i < *reg.size; ++i) {
// rootObjs[counter++] = reg.stack[i].u.objRef;
// }
// //STACK
// for (int i = 0; i < *stack.size; ++i) {
// rootObjs[counter++] = stack.stack[i].u.objRef;
// }
//
// for (int i = 0; i < rootSize; ++i) {
// if(rootObjs[i] == NULL) continue;
// copy(rootObjs[i]);
// }
// heapPartRef temp = primary;
// primary = secondary;
// secondary = temp;
//
//}
//
//void *alloc(size_t size){
// if(primary->size-primary->freiZeiger < size){
// runGC();
// }
// primary->freiZeiger += size;
// return (void *) primary->data[primary->freiZeiger - size];
//}
#endif

12
Makefile Normal file
View File

@@ -0,0 +1,12 @@
# Makefile for a simple C program
build:
cd ./bigint; make; cd ..
gcc -g -Wall -Ibigint/build/include -o support.o -c support.c
gcc -g -Wall -Ibigint/build/include -o njvm.o -c njvm.c
gcc -g -Wall -Lbigint/build/lib -o njvm njvm.o support.o -lbigint
run: build
./njvm prog.bin
debug: build
./njvm --debug prog.bin

43
Makefile3 Normal file
View File

@@ -0,0 +1,43 @@
# Makefile for a simple C program
# Compiler
CC = gcc
# program to Run
F = prog.bin
# Compiler flags
CFLAGS = -g -Wall -Ibigint/build/include
LDFLAGS = -g -Wall -Lbigint/build/lib
# Source file
SRC = njvm.c
# Executable name
TARGET = njvm
njvm.o:
$(CC) $(CFLAGS) -o njvm.o -c njvm.c
support.o:
$(CC) $(CFLAGS) -o support.o -c support.c
# Default target
all: njvm.o support.o
$(CC) $(LDFLAGS) -o $(TARGET) njvm.o support.o -lbigint
# Clean up
clean:
rm -f $(OBJ) $(TARGET)
debug: all
./$(TARGET) --debug $(F)
run: all
./$(TARGET) $(F)
nja: ./nja/nja$(V)
./nja/nja$(V) $(IN) $(OUT)
njc: ./njc/njc$(V)
./njc/njc$(V) $(IN) $(OUT)

28
SDA.c Normal file
View File

@@ -0,0 +1,28 @@
//
// Created by Nils on 03.12.2023
//
#ifndef SDA
#define SDA
#include <stdio.h>
#include "stackslot.c"
struct sda {
int *size;
ObjRef *sda;
};
ObjRef getSDA(int i, struct sda s) {
return s.sda[i];
}
void setSDA(int point, ObjRef val, struct sda s) {
if (val == NULL) perror("Value is null");
s.sda[point] = val;
}
void printSDA(struct sda s) {
for (int i = 0; i < *s.size; i++) {
printf("%i\n", *(int *)getSDA(i, s)->data);
}
}
#endif

BIN
a.out Executable file

Binary file not shown.

38
code.c Normal file
View File

@@ -0,0 +1,38 @@
#ifndef CODE
#define CODE
#include "instruktion.c"
unsigned int code1[] = {
(PUSHC << 24) | IMMEDIATE(3),
(PUSHC << 24) | IMMEDIATE(4),
(ADD << 24),
(PUSHC << 24) | IMMEDIATE(10),
(PUSHC << 24) | IMMEDIATE(6),
(SUB << 24),
(MUL << 24),
(WRINT << 24),
(PUSHC << 24) | IMMEDIATE(10),
(WRCHR << 24),
(HALT)
};
unsigned int code2[] = {
(PUSHC << 24) | IMMEDIATE(SIGN_EXTEND(-2)),
(RDINT << 24),
(MUL << 24),
(PUSHC << 24) | IMMEDIATE(3),
(ADD << 24),
(WRINT << 24),
(PUSHC << 24) | IMMEDIATE('\n'),
(WRCHR << 24),
(HALT << 24)
};
unsigned int code3[] = {
(RDCHR << 24),
(WRINT << 24),
(PUSHC << 24) | IMMEDIATE('\n'),
(WRCHR << 24),
(HALT << 24)
};
#endif

37
codeReader.c Normal file
View File

@@ -0,0 +1,37 @@
#ifndef CODEREADER
#define CODEREADER
#include "consts.c"
#include <stdio.h>
#include <stdlib.h>
#include "program.c"
unsigned int fromFile(char *path, struct program program) {
unsigned int countInstructions;
unsigned int staticVars;
FILE *fptr;
fptr = fopen(path, "r");
if (fptr == NULL) {
printf("Error: cannot open code file %s", path);
exit(EXIT_FAILURE);
}
unsigned int buffer[4];
fread(buffer, 4, 4, fptr);
// Check file type
if (buffer[0] != 0x46424A4E) {
printf("Error: wrong file type");
exit(EXIT_FAILURE);
}
if (buffer[1] != VERSION) {
printf("Error: wrong version");
exit(EXIT_FAILURE);
}
countInstructions = buffer[2];
staticVars = buffer[3];
unsigned int instBuffer[countInstructions];
fread(instBuffer, 4, countInstructions, fptr);
copyToProgram(instBuffer, countInstructions, program);
return staticVars;
}
#endif /* ifdef CODEREADER */

3
compile_flags.txt Normal file
View File

@@ -0,0 +1,3 @@
-Ibigint/build/include
-Lbigint/build/lib
-lbigint

View File

@@ -1 +0,0 @@
#define PROJECT_VERSION @PROJECT_VERSION@

7
consts.c Normal file
View File

@@ -0,0 +1,7 @@
#ifndef CONSTS
#define CONSTS
#define VERSION 8
#endif /* ifndef CONSTS
#define CONSTS
#define VERSION 2; */

55
debugMenu.c Normal file
View File

@@ -0,0 +1,55 @@
#ifndef DEBUGMENU
#define DEBUGMENU
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.c"
#include "stack.c"
void inspect(struct stack s, int fp){
//todo Does not work dont know why
char input[20];
char ref[20];
char refStr[20];
printf("DEBUG [inspect]: stack, datam object?");
fgets(input,20,stdin);
if (input[0] == 's') printStack(s, fp);
if (input[0] == 'd'){/* todo */ }
if (input[0] == 'o'){
scanf("%19s",ref);
ObjRefContainer container;
for (int i = 0; i<= container.size; i++) {
sprintf(refStr, "%p", (void *)&container.refs[i]);
if(strcmp(ref, refStr) == 0) printf("Adress exists\n");
else printf("Adress doeas not exist\n");
printf("%s",refStr);
}
}
}
void list(void){
//todo
}
void breakpoint(int *bp){
printf("BREAKPOINT: ");
char input[20];
fgets(input,20,stdin);
*bp = atoi(input);
}
void debugMenu(int fp, struct stack stack, int* debug, int point, int* bp){
char input[20];
while (true) {
printf("DEBUG(%i): inspect, list, breakpoint, run, step, quit?",point);
fgets(input, 20, stdin);
printf("%s",input);
if(input[0] == 'i') {inspect(stack,fp);}
if(input[0] == 'l') list();
if(input[0] == 'b') breakpoint(bp);
if(input[0] == 's') break;
if(input[0] == 'r') {*debug = 0; break;};
if(input[0] == 'q') exit(0);
strcpy(input, "");
}
}
#endif /* ifndef DEBUGMENU */

8301
factor.asm Normal file

File diff suppressed because it is too large Load Diff

BIN
factor.bin Normal file

Binary file not shown.

794
factor.nj Normal file
View File

@@ -0,0 +1,794 @@
//
// factor.nj -- factorize the numbers 10^n+1, n = 1..30
//
//--------------------------------------------------------------
// handle list of factors
type List = record {
Integer value;
List next;
};
List addToList(Integer value, List next) {
local List newList;
newList = new(List);
newList.value = value;
newList.next = next;
return newList;
}
List sortList(List list) {
local List result;
local List element;
local List p;
result = nil;
while (list != nil) {
element = list;
list = list.next;
if (result == nil || element.value < result.value) {
element.next = result;
result = element;
} else {
p = result;
while (p.next != nil && element.value >= p.next.value) {
p = p.next;
}
element.next = p.next;
p.next = element;
}
}
return result;
}
void showList(List list) {
if (list == nil) {
writeString("1");
} else {
while (true) {
writeInteger(list.value);
list = list.next;
if (list == nil) {
break;
}
writeString(" * ");
}
}
writeString("\n");
}
Integer evalList(List list) {
local Integer result;
result = 1;
while (list != nil) {
result = result * list.value;
list = list.next;
}
return result;
}
List fuseLists(List list1, List list2) {
local List element;
while (list1 != nil) {
element = list1;
list1 = list1.next;
element.next = list2;
list2 = element;
}
return list2;
}
//--------------------------------------------------------------
// compute 10^n+1
Integer computeTarget(Integer n) {
local Integer x;
local Integer i;
x = 1;
i = 0;
while (i < n) {
x = x * 10;
i = i + 1;
}
x = x + 1;
return x;
}
void testComputeTarget() {
writeString("computeTarget()\n");
writeString("---------------\n");
writeString("target(1) = ");
writeInteger(computeTarget(1));
writeString("\n");
writeString("target(2) = ");
writeInteger(computeTarget(2));
writeString("\n");
writeString("target(3) = ");
writeInteger(computeTarget(3));
writeString("\n");
writeString("target(4) = ");
writeInteger(computeTarget(4));
writeString("\n");
writeString("\n");
}
//--------------------------------------------------------------
// build a table of small primes
global Integer smallPrimesLimit;
global Integer[] primes;
global Integer numPrimes;
void showSmallPrimes() {
local Integer i;
local Integer k;
i = 0;
k = 0;
while (i < numPrimes) {
writeInteger(primes[i]);
writeString(" ");
k = k + 1;
if (k == 8) {
k = 0;
writeString("\n");
}
i = i + 1;
}
if (k != 0) {
writeString("\n");
}
}
void enterSmallPrime(Integer p) {
local Integer n;
local Integer[] a;
local Integer i;
if (sizeof(primes) == numPrimes) {
n = 2 * numPrimes;
a = new(Integer[n]);
i = 0;
while (i < numPrimes) {
a[i] = primes[i];
i = i + 1;
}
primes = a;
}
primes[numPrimes] = p;
numPrimes = numPrimes + 1;
}
Boolean isPrime(Integer n) {
local Integer t;
t = 3;
while (t * t <= n) {
if (n % t == 0) {
return false;
}
t = t + 2;
}
return true;
}
void calcSmallPrimes(Integer limit) {
local Integer i;
smallPrimesLimit = limit;
primes = new(Integer[256]);
numPrimes = 0;
enterSmallPrime(2);
enterSmallPrime(3);
i = 5;
while (true) {
if (i > smallPrimesLimit) {
break;
}
if (isPrime(i)) {
enterSmallPrime(i);
}
i = i + 2;
if (i > smallPrimesLimit) {
break;
}
if (isPrime(i)) {
enterSmallPrime(i);
}
i = i + 4;
}
}
void testCalcSmallPrimes() {
writeString("calcSmallPrimes()\n");
writeString("-----------------\n");
writeString("primes less than or equal to 100:\n");
calcSmallPrimes(100);
showSmallPrimes();
writeString("number of primes less than or equal to 100: ");
writeInteger(numPrimes);
writeString("\n");
calcSmallPrimes(1000);
writeString("number of primes less than or equal to 1000: ");
writeInteger(numPrimes);
writeString("\n");
calcSmallPrimes(10000);
writeString("number of primes less than or equal to 10000: ");
writeInteger(numPrimes);
writeString("\n");
calcSmallPrimes(100000);
writeString("number of primes less than or equal to 100000: ");
writeInteger(numPrimes);
writeString("\n");
writeString("\n");
}
//--------------------------------------------------------------
// try to find a small prime factor of a given number
Integer smallPrimeFactor(Integer n) {
local Integer i;
i = 0;
while (i < numPrimes) {
if (n % primes[i] == 0) {
// prime factor found
return primes[i];
}
i = i + 1;
}
// no prime factor less than or equal to smallPrimesLimit found
return 0;
}
void testSmallPrimeFactor() {
calcSmallPrimes(10000);
writeString("smallPrimeFactor()\n");
writeString("------------------\n");
writeString("small prime factor of 2: ");
writeInteger(smallPrimeFactor(2));
writeString("\n");
writeString("small prime factor of 222: ");
writeInteger(smallPrimeFactor(222));
writeString("\n");
writeString("small prime factor of 17*19*23: ");
writeInteger(smallPrimeFactor(17*19*23));
writeString("\n");
writeString("small prime factor of 7919: ");
writeInteger(smallPrimeFactor(7919));
writeString("\n");
writeString("small prime factor of 987654323: ");
writeInteger(smallPrimeFactor(987654323));
writeString("\n");
writeString("\n");
}
//--------------------------------------------------------------
// compute b^n mod m
Integer powerMod(Integer b, Integer n, Integer m) {
local Integer a;
a = 1;
while (n != 0) {
if (n % 2 == 0) {
b = (b * b) % m;
n = n / 2;
} else {
a = (a * b) % m;
n = n - 1;
}
}
return a;
}
void testPowerMod() {
writeString("powerMod()\n");
writeString("----------\n");
writeString("2^16 mod 7: ");
writeInteger(powerMod(2, 16, 7));
writeString("\n");
writeString("3^10 mod 19: ");
writeInteger(powerMod(3, 10, 19));
writeString("\n");
writeString("123^987654323 mod 987654323: ");
writeInteger(powerMod(123, 987654323, 987654323));
writeString("\n");
writeString("\n");
}
//--------------------------------------------------------------
// compute greatest common divisor
Integer GCD(Integer a, Integer b) {
local Integer r;
if (a < 0) {
a = -a;
}
if (b < 0) {
b = -b;
}
while (b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
void testGCD() {
writeString("GCD()\n");
writeString("-----\n");
writeString("GCD(3*5*5*11*37, 2*2*5*37*53) = ");
writeInteger(GCD(3*5*5*11*37, 2*2*5*37*53));
writeString("\n");
writeString("\n");
}
//--------------------------------------------------------------
// Rabin-Miller test
Boolean isComposite(Integer n) {
local Integer q;
local Integer t;
local Integer i;
local Integer a;
local Integer e;
local Integer b;
q = n - 1;
t = 0;
while (q % 2 == 0) {
q = q / 2;
t = t + 1;
}
i = 0;
while (i < 20) {
a = primes[i];
if (a >= n) {
break;
}
e = 0;
b = powerMod(a, q, n);
if (b != 1) {
while (b != 1 && b != n - 1 && e <= t - 2) {
b = (b * b) % n;
e = e + 1;
}
if (b != n - 1) {
return true;
}
}
i = i + 1;
}
return false;
}
void testIsComposite() {
local Integer n;
local Integer k;
writeString("isComposite()\n");
writeString("-------------\n");
writeString("odd numbers in [3..99] which are probably prime:\n");
n = 3;
k = 0;
while (n < 100) {
if (!isComposite(n)) {
writeInteger(n);
writeString(" ");
k = k + 1;
if (k == 8) {
k = 0;
writeString("\n");
}
}
n = n + 2;
}
if (k != 0) {
writeString("\n");
}
n = 1234567;
while (n < 1234607) {
writeInteger(n);
writeString(" is ");
if (isComposite(n)) {
writeString("definitely composite\n");
} else {
writeString("probably prime\n");
}
n = n + 2;
}
writeString("\n");
}
//--------------------------------------------------------------
Boolean provePrime(Integer n) {
// not implemented yet
return false;
}
void testProvePrime() {
writeString("provePrime()\n");
writeString("------------\n");
writeString("<not implemented yet>\n");
writeString("\n");
}
//--------------------------------------------------------------
// Pollard's rho method
Integer findFactor1(Integer n) {
local Integer y;
local Integer x;
local Integer x1;
local Integer k;
local Integer l;
local Integer p;
local Integer c;
local Integer g;
local Integer r;
y = 2;
x = 2;
x1 = 2;
k = 1;
l = 1;
p = 1;
c = 0;
while (true) {
x = (x * x + 1) % n;
p = (p * (x1 - x)) % n;
c = c + 1;
if (c == 20) {
g = GCD(p, n);
if (g > 1) {
break;
}
y = x;
c = 0;
}
k = k - 1;
if (k == 0) {
g = GCD(p, n);
if (g > 1) {
break;
}
x1 = x;
k = l;
l = 2 * l;
r = 0;
while (r < k) {
x = (x * x + 1) % n;
r = r + 1;
}
y = x;
c = 0;
}
}
do {
y = (y * y + 1) % n;
g = GCD(x1 - y, n);
} while (g == 1);
if (g < n) {
return g;
} else {
return 0;
}
}
Integer findFactor2(Integer n) {
local Integer y;
local Integer x;
local Integer x1;
local Integer k;
local Integer l;
local Integer p;
local Integer c;
local Integer g;
local Integer r;
y = 2;
x = 2;
x1 = 2;
k = 1;
l = 1;
p = 1;
c = 0;
while (true) {
x = (x * x - 1) % n;
p = (p * (x1 - x)) % n;
c = c + 1;
if (c == 20) {
g = GCD(p, n);
if (g > 1) {
break;
}
y = x;
c = 0;
}
k = k - 1;
if (k == 0) {
g = GCD(p, n);
if (g > 1) {
break;
}
x1 = x;
k = l;
l = 2 * l;
r = 0;
while (r < k) {
x = (x * x - 1) % n;
r = r + 1;
}
y = x;
c = 0;
}
}
do {
y = (y * y - 1) % n;
g = GCD(x1 - y, n);
} while (g == 1);
if (g < n) {
return g;
} else {
return 0;
}
}
Integer findFactor3(Integer n) {
local Integer y;
local Integer x;
local Integer x1;
local Integer k;
local Integer l;
local Integer p;
local Integer c;
local Integer g;
local Integer r;
y = 2;
x = 2;
x1 = 2;
k = 1;
l = 1;
p = 1;
c = 0;
while (true) {
x = (x * x + 3) % n;
p = (p * (x1 - x)) % n;
c = c + 1;
if (c == 20) {
g = GCD(p, n);
if (g > 1) {
break;
}
y = x;
c = 0;
}
k = k - 1;
if (k == 0) {
g = GCD(p, n);
if (g > 1) {
break;
}
x1 = x;
k = l;
l = 2 * l;
r = 0;
while (r < k) {
x = (x * x + 3) % n;
r = r + 1;
}
y = x;
c = 0;
}
}
do {
y = (y * y + 3) % n;
g = GCD(x1 - y, n);
} while (g == 1);
if (g < n) {
return g;
} else {
return 0;
}
}
Integer findFactor(Integer n) {
local Integer r;
r = findFactor1(n);
if (r != 0) {
return r;
}
r = findFactor2(n);
if (r != 0) {
return r;
}
r = findFactor3(n);
return r;
}
void testFindFactor() {
writeString("findFactor()\n");
writeString("------------\n");
writeString("5*5*5 = ");
writeInteger(5*5*5);
writeString(" is a multiple of ");
writeInteger(findFactor(5*5*5));
writeString("\n");
writeString("4421*5743*7699 = ");
writeInteger(4421*5743*7699);
writeString(" is a multiple of ");
writeInteger(findFactor(4421*5743*7699));
writeString("\n");
writeInteger(9999000099990001);
writeString(" is a multiple of ");
writeInteger(findFactor(9999000099990001));
writeString("\n");
writeString("\n");
}
//--------------------------------------------------------------
List factorize(Integer x, Boolean verbose) {
local List factors;
local Integer f;
local Integer f1;
local Integer f2;
local List moreFactors;
if (verbose) {
writeString("factorize(");
writeInteger(x);
writeString(")\n");
}
factors = nil;
while (x > 1) {
f = smallPrimeFactor(x);
if (f == 0) {
// no small prime factor found
if (x < smallPrimesLimit * smallPrimesLimit) {
// we know that x is prime
f = x;
} else {
// we don't know anything
break;
}
}
if (verbose) {
writeString("detected small prime factor ");
writeInteger(f);
writeString("\n");
}
factors = addToList(f, factors);
x = x / f;
}
if (x == 1) {
// x has been completely factorized
if (verbose) {
writeString("the number has been completely factorized\n");
}
return factors;
}
if (verbose) {
writeString("interim result:\n the remaining factor ");
writeInteger(x);
writeString("\n doesn't have any prime factors < ");
writeInteger(smallPrimesLimit);
writeString("\n ");
}
if (isComposite(x)) {
// x is definitely composite
if (verbose) {
writeString("but is definitely composite\n");
}
f1 = findFactor(x);
if (f1 == 0) {
// cannot factorize x, give up
writeString("cannot factorize ");
writeInteger(x);
writeString(", giving up\n");
factors = addToList(x, factors);
} else {
// x = f1 * f2
f2 = x / f1;
if (verbose) {
writeString("this number can be split into ");
writeInteger(f1);
writeString(" and ");
writeInteger(f2);
writeString("\n");
}
moreFactors = factorize(f1, verbose);
factors = fuseLists(moreFactors, factors);
moreFactors = factorize(f2, verbose);
factors = fuseLists(moreFactors, factors);
}
} else {
// x is very probably prime
if (verbose) {
writeString("and is very probably prime\n");
}
if (provePrime(x)) {
if (verbose) {
writeString("the primality of ");
writeInteger(x);
writeString(" has been proven\n");
}
} else {
writeString("cannot prove the primality of ");
writeInteger(x);
writeString(", giving up\n");
}
factors = addToList(x, factors);
}
return factors;
}
void testFactorize(Boolean verbose) {
local List factors;
writeString("factorize()\n");
writeString("-----------\n");
calcSmallPrimes(7);
showSmallPrimes();
writeString("3*5*7*7*141*49 = \n");
factors = factorize(3*5*7*7*141*49, verbose);
showList(sortList(factors));
writeString("\n");
}
//--------------------------------------------------------------
void showBar() {
writeString("---------------------------------");
writeString("-------------------------------\n");
}
void run(Boolean verbose) {
local Integer i;
local Integer x;
local List factors;
local Integer y;
calcSmallPrimes(10000);
showBar();
i = 1;
while (i <= 30) {
writeString("10^");
writeInteger(i);
writeString("+1 = ");
x = computeTarget(i);
writeInteger(x);
writeString(" = \n");
factors = factorize(x, verbose);
factors = sortList(factors);
showList(factors);
writeString("check: product = ");
y = evalList(factors);
writeInteger(y);
writeString("\n");
showBar();
i = i+ 1;
}
}
//--------------------------------------------------------------
void tests(Boolean verbose) {
writeString("\nTests\n");
writeString("=====\n\n");
testComputeTarget();
testCalcSmallPrimes();
testSmallPrimeFactor();
testPowerMod();
testGCD();
testIsComposite();
testProvePrime();
testFindFactor();
testFactorize(verbose);
}
//--------------------------------------------------------------
void main() {
//tests(true);
run(true);
}

54
instruktion.c Normal file
View File

@@ -0,0 +1,54 @@
#ifndef INSREUKTION
#define INSREUKTION
#define IMMEDIATE(x) ((x) & 0x00FFFFFF)
#define MSB (1 << (8 * sizeof(unsigned int) - 1))
#define IS_PRIMITIVE(objRef) (((objRef)->size & MSB) == 0)
#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))
#define GET_ELEMENT_COUNT(objRef) ((objRef)->size & ~MSB)
#define GET_REFS_PTR(objRef) ((ObjRef *) (objRef)-> data)
#define HALT 0
#define PUSHC 1
#define ADD 2
#define SUB 3
#define MUL 4
#define DIV 5
#define MOD 6
#define RDINT 7
#define WRINT 8
#define RDCHR 9
#define WRCHR 10
#define PUSHG 11
#define POPG 12
#define ASF 13
#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
#define PUSHR 29
#define POPR 30
#define DUP 31
#define NEW 32
#define GETF 33
#define PUTF 34
#define NEWA 35
#define GETFA 36
#define PUTFA 37
#define GETSZ 38
#define PUSHN 39
#define REFEQ 40
#define REFNE 41
#endif /* ifndef INSREUKTION */

778
matinv.asm Normal file
View File

@@ -0,0 +1,778 @@
//
// version
//
.vers 8
//
// execution framework
//
__start:
call _main
call _exit
__stop:
jmp __stop
//
// Integer readInteger()
//
_readInteger:
asf 0
rdint
popr
rsf
ret
//
// void writeInteger(Integer)
//
_writeInteger:
asf 0
pushl -3
wrint
rsf
ret
//
// Character readCharacter()
//
_readCharacter:
asf 0
rdchr
popr
rsf
ret
//
// void writeCharacter(Character)
//
_writeCharacter:
asf 0
pushl -3
wrchr
rsf
ret
//
// Integer char2int(Character)
//
_char2int:
asf 0
pushl -3
popr
rsf
ret
//
// Character int2char(Integer)
//
_int2char:
asf 0
pushl -3
popr
rsf
ret
//
// void exit()
//
_exit:
asf 0
halt
rsf
ret
//
// void writeString(String)
//
_writeString:
asf 1
pushc 0
popl 0
jmp _writeString_L2
_writeString_L1:
pushl -3
pushl 0
getfa
call _writeCharacter
drop 1
pushl 0
pushc 1
add
popl 0
_writeString_L2:
pushl 0
pushl -3
getsz
lt
brt _writeString_L1
rsf
ret
//
// Integer gcd(Integer, Integer)
//
_gcd:
asf 1
jmp __2
__1:
pushl -4
pushl -3
mod
popl 0
pushl -3
popl -4
pushl 0
popl -3
__2:
pushl -3
pushc 0
ne
brt __1
__3:
pushl -4
popr
jmp __0
__0:
rsf
ret
//
// record { Integer num; Integer den; } newFraction(Integer, Integer)
//
_newFraction:
asf 4
pushl -4
pushc 0
lt
brf __5
pushc 0
pushl -4
sub
popl 0
jmp __6
__5:
pushl -4
popl 0
__6:
pushl -3
pushc 0
lt
brf __7
pushc 0
pushl -3
sub
popl 1
jmp __8
__7:
pushl -3
popl 1
__8:
pushl 0
pushl 1
call _gcd
drop 2
pushr
popl 2
new 2
popl 3
pushl -4
pushc 0
lt
pushl -3
pushc 0
lt
ne
brf __9
pushl 3
pushc 0
pushl 0
sub
pushl 2
div
putf 0
jmp __10
__9:
pushl 3
pushl 0
pushl 2
div
putf 0
__10:
pushl 3
pushl 1
pushl 2
div
putf 1
pushl 3
popr
jmp __4
__4:
rsf
ret
//
// void writeFraction(record { Integer num; Integer den; })
//
_writeFraction:
asf 0
pushl -3
getf 0
call _writeInteger
drop 1
pushc 1
newa
dup
pushc 0
pushc 47
putfa
call _writeString
drop 1
pushl -3
getf 1
call _writeInteger
drop 1
__11:
rsf
ret
//
// record { Integer num; Integer den; } negFraction(record { Integer num; Integer den; })
//
_negFraction:
asf 0
pushc 0
pushl -3
getf 0
sub
pushl -3
getf 1
call _newFraction
drop 2
pushr
popr
jmp __12
__12:
rsf
ret
//
// record { Integer num; Integer den; } addFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_addFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -3
getf 0
pushl -4
getf 1
mul
add
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __13
__13:
rsf
ret
//
// record { Integer num; Integer den; } subFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_subFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -3
getf 0
pushl -4
getf 1
mul
sub
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __14
__14:
rsf
ret
//
// record { Integer num; Integer den; } mulFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_mulFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 0
mul
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __15
__15:
rsf
ret
//
// record { Integer num; Integer den; } divFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_divFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -4
getf 1
pushl -3
getf 0
mul
call _newFraction
drop 2
pushr
popr
jmp __16
__16:
rsf
ret
//
// Fraction[][] newMatrix(record { Integer num; Integer den; }, record { Integer num; Integer den; }, record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_newMatrix:
asf 1
pushc 2
newa
popl 0
pushl 0
pushc 0
pushc 2
newa
putfa
pushl 0
pushc 1
pushc 2
newa
putfa
pushl 0
pushc 0
getfa
pushc 0
pushl -6
putfa
pushl 0
pushc 0
getfa
pushc 1
pushl -5
putfa
pushl 0
pushc 1
getfa
pushc 0
pushl -4
putfa
pushl 0
pushc 1
getfa
pushc 1
pushl -3
putfa
pushl 0
popr
jmp __17
__17:
rsf
ret
//
// void writeMatrix(Fraction[][])
//
_writeMatrix:
asf 2
pushc 0
popl 0
jmp __20
__19:
pushc 0
popl 1
jmp __23
__22:
pushl -3
pushl 0
getfa
pushl 1
getfa
call _writeFraction
drop 1
pushc 2
newa
dup
pushc 0
pushc 32
putfa
dup
pushc 1
pushc 32
putfa
call _writeString
drop 1
pushl 1
pushc 1
add
popl 1
__23:
pushl 1
pushl -3
pushl 0
getfa
getsz
lt
brt __22
__24:
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
pushl 0
pushc 1
add
popl 0
__20:
pushl 0
pushl -3
getsz
lt
brt __19
__21:
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
__18:
rsf
ret
//
// Fraction[][] invertMatrix(Fraction[][])
//
_invertMatrix:
asf 1
pushl -3
pushc 0
getfa
pushc 0
getfa
pushl -3
pushc 1
getfa
pushc 1
getfa
call _mulFraction
drop 2
pushr
pushl -3
pushc 0
getfa
pushc 1
getfa
pushl -3
pushc 1
getfa
pushc 0
getfa
call _mulFraction
drop 2
pushr
call _subFraction
drop 2
pushr
popl 0
pushl 0
getf 0
pushc 0
eq
brf __26
pushc 33
newa
dup
pushc 0
pushc 101
putfa
dup
pushc 1
pushc 114
putfa
dup
pushc 2
pushc 114
putfa
dup
pushc 3
pushc 111
putfa
dup
pushc 4
pushc 114
putfa
dup
pushc 5
pushc 58
putfa
dup
pushc 6
pushc 32
putfa
dup
pushc 7
pushc 109
putfa
dup
pushc 8
pushc 97
putfa
dup
pushc 9
pushc 116
putfa
dup
pushc 10
pushc 114
putfa
dup
pushc 11
pushc 105
putfa
dup
pushc 12
pushc 120
putfa
dup
pushc 13
pushc 32
putfa
dup
pushc 14
pushc 99
putfa
dup
pushc 15
pushc 97
putfa
dup
pushc 16
pushc 110
putfa
dup
pushc 17
pushc 110
putfa
dup
pushc 18
pushc 111
putfa
dup
pushc 19
pushc 116
putfa
dup
pushc 20
pushc 32
putfa
dup
pushc 21
pushc 98
putfa
dup
pushc 22
pushc 101
putfa
dup
pushc 23
pushc 32
putfa
dup
pushc 24
pushc 105
putfa
dup
pushc 25
pushc 110
putfa
dup
pushc 26
pushc 118
putfa
dup
pushc 27
pushc 101
putfa
dup
pushc 28
pushc 114
putfa
dup
pushc 29
pushc 116
putfa
dup
pushc 30
pushc 101
putfa
dup
pushc 31
pushc 100
putfa
dup
pushc 32
pushc 10
putfa
call _writeString
drop 1
call _exit
__26:
pushl -3
pushc 1
getfa
pushc 1
getfa
pushl 0
call _divFraction
drop 2
pushr
pushl -3
pushc 0
getfa
pushc 1
getfa
call _negFraction
drop 1
pushr
pushl 0
call _divFraction
drop 2
pushr
pushl -3
pushc 1
getfa
pushc 0
getfa
call _negFraction
drop 1
pushr
pushl 0
call _divFraction
drop 2
pushr
pushl -3
pushc 0
getfa
pushc 0
getfa
pushl 0
call _divFraction
drop 2
pushr
call _newMatrix
drop 4
pushr
popr
jmp __25
__25:
rsf
ret
//
// void main()
//
_main:
asf 3
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
pushc 7
pushc 1
call _newFraction
drop 2
pushr
pushc 4
pushc 1
call _newFraction
drop 2
pushr
pushc 6
pushc 1
call _newFraction
drop 2
pushr
pushc 5
pushc 1
call _newFraction
drop 2
pushr
call _newMatrix
drop 4
pushr
popl 0
pushl 0
call _writeMatrix
drop 1
pushl 0
call _invertMatrix
drop 1
pushr
popl 1
pushl 1
call _writeMatrix
drop 1
pushl 1
call _invertMatrix
drop 1
pushr
popl 2
pushl 2
call _writeMatrix
drop 1
__27:
rsf
ret

BIN
matinv.bin Normal file

Binary file not shown.

146
matinv.nj Normal file
View File

@@ -0,0 +1,146 @@
//
// matinv.nj -- invert 2x2 matrices of fractions
//
//--------------------------------------------------------------
// greatest common divisor
Integer gcd(Integer a, Integer b) {
local Integer h;
while (b != 0) {
h = a % b;
a = b;
b = h;
}
return a;
}
//--------------------------------------------------------------
// fractions
type Fraction = record {
Integer num;
Integer den;
};
Fraction newFraction(Integer num, Integer den) {
local Integer n;
local Integer d;
local Integer g;
local Fraction r;
if (num < 0) {
n = -num;
} else {
n = num;
}
if (den < 0) {
d = -den;
} else {
d = den;
}
g = gcd(n, d);
r = new(Fraction);
if ((num < 0) != (den < 0)) {
r.num = -n / g;
} else {
r.num = n / g;
}
r.den = d / g;
return r;
}
void writeFraction(Fraction f) {
writeInteger(f.num);
writeString("/");
writeInteger(f.den);
}
Fraction negFraction(Fraction f) {
return newFraction(-f.num, f.den);
}
Fraction addFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.den + f2.num * f1.den, f1.den * f2.den);
}
Fraction subFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.den - f2.num * f1.den, f1.den * f2.den);
}
Fraction mulFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.num, f1.den * f2.den);
}
Fraction divFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.den, f1.den * f2.num);
}
//--------------------------------------------------------------
// 2x2 matrices of fractions
type Matrix = Fraction[][];
Matrix newMatrix(Fraction a00, Fraction a01,
Fraction a10, Fraction a11) {
local Matrix m;
m = new(Fraction[2][]);
m[0] = new(Fraction[2]);
m[1] = new(Fraction[2]);
m[0][0] = a00;
m[0][1] = a01;
m[1][0] = a10;
m[1][1] = a11;
return m;
}
void writeMatrix(Matrix m) {
local Integer i;
local Integer j;
i = 0;
while (i < sizeof(m)) {
j = 0;
while (j < sizeof(m[i])) {
writeFraction(m[i][j]);
writeString(" ");
j = j + 1;
}
writeString("\n");
i = i + 1;
}
writeString("\n");
}
Matrix invertMatrix(Matrix m) {
local Fraction det;
det = subFraction(mulFraction(m[0][0], m[1][1]),
mulFraction(m[0][1], m[1][0]));
if (det.num == 0) {
writeString("error: matrix cannot be inverted\n");
exit();
}
return newMatrix(
divFraction(m[1][1], det), divFraction(negFraction(m[0][1]), det),
divFraction(negFraction(m[1][0]), det), divFraction(m[0][0], det)
);
}
//--------------------------------------------------------------
void main() {
local Matrix matrix;
local Matrix result1;
local Matrix result2;
writeString("\n");
matrix = newMatrix(
newFraction(7, 1), newFraction(4, 1),
newFraction(6, 1), newFraction(5, 1)
);
writeMatrix(matrix);
result1 = invertMatrix(matrix);
writeMatrix(result1);
result2 = invertMatrix(result1);
writeMatrix(result2);
}

BIN
nja/nja2 Executable file

Binary file not shown.

BIN
nja/nja3 Executable file

Binary file not shown.

BIN
nja/nja4 Executable file

Binary file not shown.

BIN
nja/nja5 Executable file

Binary file not shown.

BIN
nja/nja6 Executable file

Binary file not shown.

BIN
nja/nja7 Executable file

Binary file not shown.

BIN
nja/nja8 Executable file

Binary file not shown.

BIN
nja/nja8l Executable file

Binary file not shown.

BIN
nja/nja?inline=false Normal file

Binary file not shown.

14
njc/njc4 Executable file
View File

@@ -0,0 +1,14 @@
--2024-01-14 15:07:13-- https://git.thm.de/arin07/KSP_public/-/raw/master/aufgaben/a4/njc?inline=false
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving git.thm.de (git.thm.de)... 212.201.6.138
Connecting to git.thm.de (git.thm.de)|212.201.6.138|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 137095 (134K) [application/octet-stream]
Saving to: njc?inline=false
0K .......... .......... .......... .......... .......... 37% 1.23M 0s
50K .......... .......... .......... .......... .......... 74% 2.63M 0s
100K .......... .......... .......... ... 100% 9.98M=0.06s
2024-01-14 15:07:14 (2.13 MB/s) - njc?inline=false saved [137095/137095]

14
njc/njc5 Executable file
View File

@@ -0,0 +1,14 @@
--2024-01-14 15:07:20-- https://git.thm.de/arin07/KSP_public/-/raw/master/aufgaben/a5/njc?inline=false
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving git.thm.de (git.thm.de)... 212.201.6.138
Connecting to git.thm.de (git.thm.de)|212.201.6.138|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 137095 (134K) [application/octet-stream]
Saving to: njc?inline=false.1
0K .......... .......... .......... .......... .......... 37% 1.21M 0s
50K .......... .......... .......... .......... .......... 74% 2.51M 0s
100K .......... .......... .......... ... 100% 11.2M=0.06s
2024-01-14 15:07:21 (2.08 MB/s) - njc?inline=false.1 saved [137095/137095]

14
njc/njc6 Executable file
View File

@@ -0,0 +1,14 @@
--2024-01-14 15:07:28-- https://git.thm.de/arin07/KSP_public/-/raw/master/aufgaben/a6/njc?inline=false
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving git.thm.de (git.thm.de)... 212.201.6.138
Connecting to git.thm.de (git.thm.de)|212.201.6.138|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 137095 (134K) [application/octet-stream]
Saving to: njc?inline=false.2
0K .......... .......... .......... .......... .......... 37% 1.02M 0s
50K .......... .......... .......... .......... .......... 74% 2.03M 0s
100K .......... .......... .......... ... 100% 11.4M=0.07s
2024-01-14 15:07:28 (1.74 MB/s) - njc?inline=false.2 saved [137095/137095]

BIN
njc/njc7 Executable file

Binary file not shown.

BIN
njc/njc8 Executable file

Binary file not shown.

BIN
njc/njc8l Executable file

Binary file not shown.

11070
njlisp.asm Normal file

File diff suppressed because it is too large Load Diff

BIN
njlisp.bin Normal file

Binary file not shown.

2580
njlisp.nj Normal file

File diff suppressed because it is too large Load Diff

392
njvm.c
View File

@@ -1,43 +1,381 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include "instruktion.c"
#include "stack.c"
#include "program.c"
#include "codeReader.c"
#include "debugMenu.c"
#include "bigint.h"
#include "record.c"
#include "GC.c"
void version() {
printf("Ninja Virtual Machine version %i (compiled %s, %s)\n", PROJECT_VERSION, __DATE__, __TIME__);
// Debug
int debug = 0;
// Program
struct program program;
unsigned fp;
void version(void) {
printf("Ninja Virtual Machine version %i (compiled %s, %s)\n", 0, __DATE__, __TIME__);
}
void help() {
printf("usage: ./njvm [option] [option] ...\n\t--version\tshow version and exit\n\t--help\t\tshow this help and exit");
void help(void) {
printf("Usage: ./njvm [options] <code file>\n\t--debug\tstart virtual machine in debug mode\n\t--version\tshow version and exit\n\t--help\t\tshow this help and exit\n");
}
void printArgs(int argc, char *argv[]){
for (int i = 0; i < argc; ++i) {
printf("%s\n", argv[i]);
}
}
void useption(int argc, char *argv[]){
if (argc > 1) {
if (strcmp(argv[1], "--version") == 0) {
version();
} else if (strcmp(argv[1], "--help") == 0) {
help();
} else if (argc != 0) {
printf("unknown command line argument '%s', try './njvm --help'", argv[1]);
void execute(struct program program) {
int bp = -1;
int i;
char charInput;
StackSlot tempSlot;
ObjRef tempObj;
ObjRef tempObj2;
int tempInt;
for (i = 0; i < *program.size; ++i) {
if (debug == 1 || bp == i) debugMenu(fp, stack, &debug, i, &bp);
if(debug == 1) printf("(%i)",i);
switch (program.program[i] >> 24) {
case HALT:
if (debug == 1) printf("halt\n");
goto end;
case PUSHC:
if (debug == 1) printf("pushc: %i\n", IMMEDIATE(program.program[i]));
bigFromInt(SIGN_EXTEND(IMMEDIATE(program.program[i])));
push(stack, stackSlotWithObjRef(bip.res));
break;
case ADD:
if (debug == 1) printf("add: %i + %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigAdd();
push(stack, stackSlotWithObjRef(bip.res));
break;
case SUB:
if (debug == 1) printf("sub: %i - %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigSub();
push(stack, stackSlotWithObjRef(bip.res));
break;
case MUL:
if (debug == 1) printf("mul: %i * %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigMul();
push(stack, stackSlotWithObjRef(bip.res));
break;
case DIV:
if (debug == 1) printf("div: %i / %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigDiv();
push(stack, stackSlotWithObjRef(bip.res));
break;
case MOD:
if (debug == 1) printf("mod: %i %% %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigDiv();
push(stack, stackSlotWithObjRef(bip.rem));
break;
case RDINT:
if (debug == 1) printf("rdint\n");
bigRead(stdin);
push(stack, stackSlotWithObjRef(bip.res));
if (debug == 1) printf("pushed %i\n", peek(stack, 1));
break;
case WRINT:
if (debug == 1) printf("wrint: %i\n", peek(stack, 1));
bip.op1 = pop(stack).u.objRef;
bigPrint(stdout);
break;
case RDCHR:
if (debug == 1) printf("rdchr\n");
scanf("%c", &charInput);
bigFromInt(charInput);
push(stack, stackSlotWithObjRef(bip.res));
if (debug == 1) printf("pushed %c\n", charInput);
break;
case WRCHR:
if (debug == 1) printf("wrchr: %c\n", peek(stack, 1));
bip.op1 = pop(stack).u.objRef;
printf("%c", bigToInt());
break;
case PUSHG:
if (debug == 1) printf("pushg: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
push(stack, stackSlotWithObjRef(getSDA(SIGN_EXTEND(IMMEDIATE(program.program[i])), sda)));
break;
case POPG:
if (debug == 1) printf("popg: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
setSDA(SIGN_EXTEND(IMMEDIATE(program.program[i])), pop(stack).u.objRef, sda);
break;
case ASF:
if (debug == 1) printf("asf: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
push(stack, stackSlotWitchNumber(fp));
fp = *stack.current;
*stack.current = *stack.current + SIGN_EXTEND(IMMEDIATE(program.program[i]));
break;
case RSF:
if (debug == 1) printf("rsf: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
*stack.current = fp;
if (debug == 1) printf("pop: %i\n", peek(stack, 1));
tempSlot = pop(stack);
fp = tempSlot.u.number;
break;
case POPL:
if (debug == 1) printf("popl: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
stack.stack[fp + SIGN_EXTEND(IMMEDIATE(program.program[i]))] = pop(stack);
break;
case PUSHL:
if (debug == 1) printf("pushl: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
push(stack, stack.stack[fp + SIGN_EXTEND(IMMEDIATE(program.program[i]))]);
break;
case NE:
if (debug == 1) printf("ne: %i != %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigFromInt(bigCmp() != 0);
push(stack, stackSlotWithObjRef(bip.res));
break;
case EQ:
if (debug == 1) printf("eq: %i == %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigFromInt(bigCmp() == 0);
push(stack, stackSlotWithObjRef(bip.res));
break;
case LT:
if (debug == 1) printf("lt: %i < %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigFromInt(bigCmp() < 0);
push(stack, stackSlotWithObjRef(bip.res));
break;
case LE:
if (debug == 1) printf("le: %i <= %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigFromInt(bigCmp() <= 0);
push(stack, stackSlotWithObjRef(bip.res));
break;
case GT:
if (debug == 1) printf("gt: %i > %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigFromInt(bigCmp() > 0);
push(stack, stackSlotWithObjRef(bip.res));
break;
case GE:
if (debug == 1) printf("ge: %i >= %i\n", peek(stack, 2), peek(stack, 1));
bip.op2 = pop(stack).u.objRef;
bip.op1 = pop(stack).u.objRef;
bigFromInt(bigCmp() >= 0);
push(stack, stackSlotWithObjRef(bip.res));
break;
case BRF:
if (debug == 1) printf("brf: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
if (debug == 1) printf("pop: %i\n", peek(stack, 1));
bip.op1 = pop(stack).u.objRef;
int b = bigToInt();
if (b == false) {
i = SIGN_EXTEND(IMMEDIATE(program.program[i])) - 1;
if (debug == 1) printf("new i: %i\n", i);
} else if (b != true) {
printf("Error: brf: %i\n", b);
exit(EXIT_FAILURE);
}
break;
case BRT:
if (debug == 1) printf("brt: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
if (debug == 1) printf("pop: %i\n", peek(stack, 1));
bip.op1 = pop(stack).u.objRef;
b = bigToInt();
if (b == true) {
i = SIGN_EXTEND(IMMEDIATE(program.program[i])) - 1;
if (debug == 1) printf("new i: %i\n", i);
} else if (b != false) {
printf("Error: brt: %i\n", b);
exit(EXIT_FAILURE);
}
break;
case JMP:
if (debug == 1) printf("jmp: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
i = SIGN_EXTEND(IMMEDIATE(program.program[i])) - 1;
if (debug == 1) printf("new i: %i\n", i);
break;
case CALL:
if (debug == 1) printf("call: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
push(stack, stackSlotWitchNumber(i));
if (debug == 1) printf("push: %i\n", i + 1);
i = SIGN_EXTEND(IMMEDIATE(program.program[i])) - 1;
if (debug == 1) printf("new i: %i\n", i);
break;
case RET:
if (debug == 1) printf("ret\n");
if (debug == 1) printf("pop: %i\n", peek(stack, 1));
i = getIntValfromStackSlot(pop(stack));
if (debug == 1) printf("new i: %i\n", i);
break;
case DROP:
if (debug == 1) printf("drop\n");
*stack.current = *stack.current - SIGN_EXTEND(IMMEDIATE(program.program[i]));
break;
case DUP:
if (debug == 1) printf("dup\n");
tempObj = pop(stack).u.objRef;
push(stack, stackSlotWithObjRef(tempObj));
push(stack, stackSlotWithObjRef(tempObj));
break;
case POPR:
if (debug == 1) printf("popr\n");
push(reg, pop(stack));
break;
case PUSHR:
if (debug == 1) printf("pushr\n");
push(stack, pop(reg));
break;
case NEW:
if (debug == 1) printf("new\t%i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
push(stack, stackSlotWithObjRef(newRecord(SIGN_EXTEND(IMMEDIATE(program.program[i])))));
break;
case GETF:
if (debug == 1) printf("getf\n");
tempObj = pop(stack).u.objRef;
push(stack, stackSlotWithObjRef(getField(tempObj,SIGN_EXTEND(IMMEDIATE(program.program[i])))));
break;
case PUTF:
if (debug == 1) printf("putf\t%i\n", SIGN_EXTEND(IMMEDIATE(program.program[i])));
tempObj = pop(stack).u.objRef;
tempObj2 = pop(stack).u.objRef;
setField(tempObj2, SIGN_EXTEND(IMMEDIATE(program.program[i])),tempObj);
break;
case NEWA:
if(debug == 1) printf("newa\n");
bip.op1 = pop(stack).u.objRef;
push(stack, stackSlotWithObjRef(newRecord(bigToInt())));
break;
case GETFA:
if(debug == 1) printf("getfa\n");
bip.op1 = pop(stack).u.objRef;
tempInt = bigToInt();
tempObj = pop(stack).u.objRef;
push(stack, stackSlotWithObjRef(getField(tempObj,bigToInt())));
break;
case PUTFA:
if (debug == 1) printf("putfa\n");
tempObj = pop(stack).u.objRef; // Value
tempObj2 = pop(stack).u.objRef; // Index
bip.op1 = tempObj2;
tempInt = bigToInt();
setField(pop(stack).u.objRef, tempInt,tempObj);
break;
case GETSZ:
if (debug == 1) printf("getsz\n");
tempObj = pop(stack).u.objRef;
if(IS_PRIMITIVE(tempObj)) bigFromInt(-1);
else bigFromInt(GET_ELEMENT_COUNT(tempObj));
push(stack, stackSlotWithObjRef(bip.res));
break;
case PUSHN:
if (debug == 1) printf("pushn\n");
push(stack, stackSlotWithObjRef(NULL));
break;
case REFEQ:
if (debug == 1) printf("refeq\n");
if(pop(stack).u.objRef == pop(stack).u.objRef) bigFromInt(true);
else bigFromInt(false);
push(stack, stackSlotWithObjRef(bip.res));
break;
case REFNE:
if (debug == 1) printf("refeq\n");
if(pop(stack).u.objRef != pop(stack).u.objRef) bigFromInt(true);
else bigFromInt(false);
push(stack, stackSlotWithObjRef(bip.res));
break;
}
}
end:
return;
}
void tests(void) {
}
int main(int argc, char *argv[]) {
printArgs(argc,argv);
if (argc > 1) useption(argc,argv);
else {
// Started
// Initialize the Stack
int size = SIZE;
int current = 0;
stack.size = &size;
stack.current = &current;
stack.stack = malloc(SIZE * 1024);
if (stack.stack == NULL) {
perror("malloc");
}
// Initialize the registery
int rSize = 100000;
int rCurrent = 0;
StackSlot r[100000];
reg.size = &rSize;
reg.current = &rCurrent;
reg.stack = r;
// Initialize ProgrammSpeicher
int psize = 100000;
int saveProgram = 0;
unsigned int p[100000];
program.size = &psize;
program.program = p;
program.saveProgram = &saveProgram;
int run = 0;
int sizeSDA;
if (argc > 1) {
for (int i = 1; i < argc; ++i) {
if (strcmp(argv[i], "--debug") == 0) {
debug = 1;
} else if (strcmp(argv[i], "--version") == 0) {
version();
return 0;
} else if (strcmp(argv[i], "--help") == 0) {
help();
return 0;
} else if (strcmp(argv[i], "--stack") == 0) {
i++;
// TODO: implement stack size
} else if (strcmp(argv[i], "--heap") == 0) {
i++;
// TODO: implement heap size
} else if (strcmp(argv[i], "--gcpurge") == 0) {
// TODO: implement gcpurge
} else {
sizeSDA = fromFile(argv[i], program);
run = 1;
}
}
}
if (debug) {
tests();
}
if (run) {
printf("Ninja Virtual Machine started\n");
// Stopped
ObjRef s[sizeSDA];
sda.size = &sizeSDA;
sda.sda = s;
if (debug == 1) printProgram(program);
execute(program);
printf("Ninja Virtual Machine stopped\n");
return 0;
} else {
printf("Error: no code file specified\n");
return 1;
}
}

BIN
njvm.o Normal file

Binary file not shown.

BIN
njvm2 Executable file

Binary file not shown.

BIN
njvm6 Executable file

Binary file not shown.

BIN
njvm7 Executable file

Binary file not shown.

BIN
njvm?inline=false.2 Normal file

Binary file not shown.

13
objref.c Normal file
View File

@@ -0,0 +1,13 @@
#ifndef OBJREF
#define OBJREF
#include <stdbool.h>
typedef struct ObjRef{
bool brokenHeart;
// struct ObjRef *forward_pointer;
unsigned int size;
unsigned char data[1];
} *ObjRef;
#endif /* ifndef OBJREF
#define OBJREF */

8301
prog.asm Normal file

File diff suppressed because it is too large Load Diff

BIN
prog.bin Normal file

Binary file not shown.

134
program.c Normal file
View File

@@ -0,0 +1,134 @@
/*
* Created by Nils on 30.10.2023.
*/
#ifndef PROGRAM
#define PROGRAM
#include <string.h>
#include "instruktion.c"
#include <stdio.h>
struct program {
int *size;
unsigned int *program;
int *saveProgram;
};
void copyToProgram(const unsigned int codeToCopy[], int size, struct program program) {
for (int i = 0; i < size; ++i) {
program.program[i] = codeToCopy[i];
}
*program.size = size;
*program.saveProgram = 1;
}
void printProgram(struct program program) {
char c[10];
for (int i = 0; i < *program.size; i++) {
switch (program.program[i] >> 24) {
case PUSHC:
strcpy(c, "pushc");
break;
case ADD:
strcpy(c, "add");
break;
case SUB:
strcpy(c, "sub");
break;
case MUL:
strcpy(c, "mul");
break;
case DIV:
strcpy(c, "div");
break;
case MOD:
strcpy(c, "mod");
break;
case RDINT:
strcpy(c, "rdint");
break;
case WRINT:
strcpy(c, "wrint");
break;
case RDCHR:
strcpy(c, "rdchr");
break;
case WRCHR:
strcpy(c, "wrchr");
break;
case HALT:
strcpy(c, "halt");
break;
case PUSHG :
strcpy(c, "pushg");
break;
case POPG:
strcpy(c, "popg");
break;
case ASF:
strcpy(c, "asf");
break;
case RSF:
strcpy(c, "rsf");
break;
case PUSHL:
strcpy(c, "pushl");
break;
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 LE:
strcpy(c, "le");
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;
case CALL:
strcpy(c, "call");
break;
case RET:
strcpy(c, "ret");
break;
case DROP:
strcpy(c, "drop");
break;
case PUSHR:
strcpy(c, "pushr");
break;
case POPR:
strcpy(c, "popr");
break;
case DUP:
strcpy(c, "dup");
break;
default:
strcpy(c, "ERROR");
break;
}
IMMEDIATE(program.program[i]) ? printf("%03i:\t%s\t%i\n", i, c, SIGN_EXTEND(IMMEDIATE(program.program[i]))) : printf(
"%03i:\t%s\n", i, c);
}
}
#endif /* ifndef PROGRAMM */

778
programs/matrix.asm Normal file
View File

@@ -0,0 +1,778 @@
//
// version
//
.vers 7
//
// execution framework
//
__start:
call _main
call _exit
__stop:
jmp __stop
//
// Integer readInteger()
//
_readInteger:
asf 0
rdint
popr
rsf
ret
//
// void writeInteger(Integer)
//
_writeInteger:
asf 0
pushl -3
wrint
rsf
ret
//
// Character readCharacter()
//
_readCharacter:
asf 0
rdchr
popr
rsf
ret
//
// void writeCharacter(Character)
//
_writeCharacter:
asf 0
pushl -3
wrchr
rsf
ret
//
// Integer char2int(Character)
//
_char2int:
asf 0
pushl -3
popr
rsf
ret
//
// Character int2char(Integer)
//
_int2char:
asf 0
pushl -3
popr
rsf
ret
//
// void exit()
//
_exit:
asf 0
halt
rsf
ret
//
// void writeString(String)
//
_writeString:
asf 1
pushc 0
popl 0
jmp _writeString_L2
_writeString_L1:
pushl -3
pushl 0
getfa
call _writeCharacter
drop 1
pushl 0
pushc 1
add
popl 0
_writeString_L2:
pushl 0
pushl -3
getsz
lt
brt _writeString_L1
rsf
ret
//
// Integer gcd(Integer, Integer)
//
_gcd:
asf 1
jmp __2
__1:
pushl -4
pushl -3
mod
popl 0
pushl -3
popl -4
pushl 0
popl -3
__2:
pushl -3
pushc 0
ne
brt __1
__3:
pushl -4
popr
jmp __0
__0:
rsf
ret
//
// record { Integer num; Integer den; } newFraction(Integer, Integer)
//
_newFraction:
asf 4
pushl -4
pushc 0
lt
brf __5
pushc 0
pushl -4
sub
popl 0
jmp __6
__5:
pushl -4
popl 0
__6:
pushl -3
pushc 0
lt
brf __7
pushc 0
pushl -3
sub
popl 1
jmp __8
__7:
pushl -3
popl 1
__8:
pushl 0
pushl 1
call _gcd
drop 2
pushr
popl 2
new 2
popl 3
pushl -4
pushc 0
lt
pushl -3
pushc 0
lt
ne
brf __9
pushl 3
pushc 0
pushl 0
sub
pushl 2
div
putf 0
jmp __10
__9:
pushl 3
pushl 0
pushl 2
div
putf 0
__10:
pushl 3
pushl 1
pushl 2
div
putf 1
pushl 3
popr
jmp __4
__4:
rsf
ret
//
// void writeFraction(record { Integer num; Integer den; })
//
_writeFraction:
asf 0
pushl -3
getf 0
call _writeInteger
drop 1
pushc 1
newa
dup
pushc 0
pushc 47
putfa
call _writeString
drop 1
pushl -3
getf 1
call _writeInteger
drop 1
__11:
rsf
ret
//
// record { Integer num; Integer den; } negFraction(record { Integer num; Integer den; })
//
_negFraction:
asf 0
pushc 0
pushl -3
getf 0
sub
pushl -3
getf 1
call _newFraction
drop 2
pushr
popr
jmp __12
__12:
rsf
ret
//
// record { Integer num; Integer den; } addFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_addFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -3
getf 0
pushl -4
getf 1
mul
add
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __13
__13:
rsf
ret
//
// record { Integer num; Integer den; } subFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_subFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -3
getf 0
pushl -4
getf 1
mul
sub
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __14
__14:
rsf
ret
//
// record { Integer num; Integer den; } mulFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_mulFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 0
mul
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __15
__15:
rsf
ret
//
// record { Integer num; Integer den; } divFraction(record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_divFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -4
getf 1
pushl -3
getf 0
mul
call _newFraction
drop 2
pushr
popr
jmp __16
__16:
rsf
ret
//
// Fraction[][] newMatrix(record { Integer num; Integer den; }, record { Integer num; Integer den; }, record { Integer num; Integer den; }, record { Integer num; Integer den; })
//
_newMatrix:
asf 1
pushc 2
newa
popl 0
pushl 0
pushc 0
pushc 2
newa
putfa
pushl 0
pushc 1
pushc 2
newa
putfa
pushl 0
pushc 0
getfa
pushc 0
pushl -6
putfa
pushl 0
pushc 0
getfa
pushc 1
pushl -5
putfa
pushl 0
pushc 1
getfa
pushc 0
pushl -4
putfa
pushl 0
pushc 1
getfa
pushc 1
pushl -3
putfa
pushl 0
popr
jmp __17
__17:
rsf
ret
//
// void writeMatrix(Fraction[][])
//
_writeMatrix:
asf 2
pushc 0
popl 0
jmp __20
__19:
pushc 0
popl 1
jmp __23
__22:
pushl -3
pushl 0
getfa
pushl 1
getfa
call _writeFraction
drop 1
pushc 2
newa
dup
pushc 0
pushc 32
putfa
dup
pushc 1
pushc 32
putfa
call _writeString
drop 1
pushl 1
pushc 1
add
popl 1
__23:
pushl 1
pushl -3
pushl 0
getfa
getsz
lt
brt __22
__24:
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
pushl 0
pushc 1
add
popl 0
__20:
pushl 0
pushl -3
getsz
lt
brt __19
__21:
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
__18:
rsf
ret
//
// Fraction[][] invertMatrix(Fraction[][])
//
_invertMatrix:
asf 1
pushl -3
pushc 0
getfa
pushc 0
getfa
pushl -3
pushc 1
getfa
pushc 1
getfa
call _mulFraction
drop 2
pushr
pushl -3
pushc 0
getfa
pushc 1
getfa
pushl -3
pushc 1
getfa
pushc 0
getfa
call _mulFraction
drop 2
pushr
call _subFraction
drop 2
pushr
popl 0
pushl 0
getf 0
pushc 0
eq
brf __26
pushc 33
newa
dup
pushc 0
pushc 101
putfa
dup
pushc 1
pushc 114
putfa
dup
pushc 2
pushc 114
putfa
dup
pushc 3
pushc 111
putfa
dup
pushc 4
pushc 114
putfa
dup
pushc 5
pushc 58
putfa
dup
pushc 6
pushc 32
putfa
dup
pushc 7
pushc 109
putfa
dup
pushc 8
pushc 97
putfa
dup
pushc 9
pushc 116
putfa
dup
pushc 10
pushc 114
putfa
dup
pushc 11
pushc 105
putfa
dup
pushc 12
pushc 120
putfa
dup
pushc 13
pushc 32
putfa
dup
pushc 14
pushc 99
putfa
dup
pushc 15
pushc 97
putfa
dup
pushc 16
pushc 110
putfa
dup
pushc 17
pushc 110
putfa
dup
pushc 18
pushc 111
putfa
dup
pushc 19
pushc 116
putfa
dup
pushc 20
pushc 32
putfa
dup
pushc 21
pushc 98
putfa
dup
pushc 22
pushc 101
putfa
dup
pushc 23
pushc 32
putfa
dup
pushc 24
pushc 105
putfa
dup
pushc 25
pushc 110
putfa
dup
pushc 26
pushc 118
putfa
dup
pushc 27
pushc 101
putfa
dup
pushc 28
pushc 114
putfa
dup
pushc 29
pushc 116
putfa
dup
pushc 30
pushc 101
putfa
dup
pushc 31
pushc 100
putfa
dup
pushc 32
pushc 10
putfa
call _writeString
drop 1
call _exit
__26:
pushl -3
pushc 1
getfa
pushc 1
getfa
pushl 0
call _divFraction
drop 2
pushr
pushl -3
pushc 0
getfa
pushc 1
getfa
call _negFraction
drop 1
pushr
pushl 0
call _divFraction
drop 2
pushr
pushl -3
pushc 1
getfa
pushc 0
getfa
call _negFraction
drop 1
pushr
pushl 0
call _divFraction
drop 2
pushr
pushl -3
pushc 0
getfa
pushc 0
getfa
pushl 0
call _divFraction
drop 2
pushr
call _newMatrix
drop 4
pushr
popr
jmp __25
__25:
rsf
ret
//
// void main()
//
_main:
asf 3
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
pushc 7
pushc 1
call _newFraction
drop 2
pushr
pushc 4
pushc 1
call _newFraction
drop 2
pushr
pushc 6
pushc 1
call _newFraction
drop 2
pushr
pushc 5
pushc 1
call _newFraction
drop 2
pushr
call _newMatrix
drop 4
pushr
popl 0
pushl 0
call _writeMatrix
drop 1
pushl 0
call _invertMatrix
drop 1
pushr
popl 1
pushl 1
call _writeMatrix
drop 1
pushl 1
call _invertMatrix
drop 1
pushr
popl 2
pushl 2
call _writeMatrix
drop 1
__27:
rsf
ret

146
programs/matrix.nj Normal file
View File

@@ -0,0 +1,146 @@
//
// matinv.nj -- invert 2x2 matrices of fractions
//
//--------------------------------------------------------------
// greatest common divisor
Integer gcd(Integer a, Integer b) {
local Integer h;
while (b != 0) {
h = a % b;
a = b;
b = h;
}
return a;
}
//--------------------------------------------------------------
// fractions
type Fraction = record {
Integer num;
Integer den;
};
Fraction newFraction(Integer num, Integer den) {
local Integer n;
local Integer d;
local Integer g;
local Fraction r;
if (num < 0) {
n = -num;
} else {
n = num;
}
if (den < 0) {
d = -den;
} else {
d = den;
}
g = gcd(n, d);
r = new(Fraction);
if ((num < 0) != (den < 0)) {
r.num = -n / g;
} else {
r.num = n / g;
}
r.den = d / g;
return r;
}
void writeFraction(Fraction f) {
writeInteger(f.num);
writeString("/");
writeInteger(f.den);
}
Fraction negFraction(Fraction f) {
return newFraction(-f.num, f.den);
}
Fraction addFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.den + f2.num * f1.den, f1.den * f2.den);
}
Fraction subFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.den - f2.num * f1.den, f1.den * f2.den);
}
Fraction mulFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.num, f1.den * f2.den);
}
Fraction divFraction(Fraction f1, Fraction f2) {
return newFraction(f1.num * f2.den, f1.den * f2.num);
}
//--------------------------------------------------------------
// 2x2 matrices of fractions
type Matrix = Fraction[][];
Matrix newMatrix(Fraction a00, Fraction a01,
Fraction a10, Fraction a11) {
local Matrix m;
m = new(Fraction[2][]);
m[0] = new(Fraction[2]);
m[1] = new(Fraction[2]);
m[0][0] = a00;
m[0][1] = a01;
m[1][0] = a10;
m[1][1] = a11;
return m;
}
void writeMatrix(Matrix m) {
local Integer i;
local Integer j;
i = 0;
while (i < sizeof(m)) {
j = 0;
while (j < sizeof(m[i])) {
writeFraction(m[i][j]);
writeString(" ");
j = j + 1;
}
writeString("\n");
i = i + 1;
}
writeString("\n");
}
Matrix invertMatrix(Matrix m) {
local Fraction det;
det = subFraction(mulFraction(m[0][0], m[1][1]),
mulFraction(m[0][1], m[1][0]));
if (det.num == 0) {
writeString("error: matrix cannot be inverted\n");
exit();
}
return newMatrix(
divFraction(m[1][1], det), divFraction(negFraction(m[0][1]), det),
divFraction(negFraction(m[1][0]), det), divFraction(m[0][0], det)
);
}
//--------------------------------------------------------------
void main() {
local Matrix matrix;
local Matrix result1;
local Matrix result2;
writeString("\n");
matrix = newMatrix(
newFraction(7, 1), newFraction(4, 1),
newFraction(6, 1), newFraction(5, 1)
);
writeMatrix(matrix);
result1 = invertMatrix(matrix);
writeMatrix(result1);
result2 = invertMatrix(result1);
writeMatrix(result2);
}

26
programs/newFraction.asm Normal file
View File

@@ -0,0 +1,26 @@
_subFraction:
asf 0
pushl -4
getf 0
pushl -3
getf 1
mul
pushl -3
getf 0
pushl -4
getf 1
mul
sub
pushl -4
getf 1
pushl -3
getf 1
mul
call _newFraction
drop 2
pushr
popr
jmp __14
__14:
rsf
ret

BIN
programs/nja Executable file

Binary file not shown.

28
programs/prog02.asm Normal file
View File

@@ -0,0 +1,28 @@
//
// prog02.asm -- call/ret with args, but without ret value
//
asf 3
pushc 11
pushc 33
call proc
drop 2
rsf
halt
proc:
asf 2
pushl -4
wrint
pushc '\n'
wrchr
pushc 22
wrint
pushc '\n'
wrchr
pushl -3
wrint
pushc '\n'
wrchr
rsf
ret

BIN
programs/prog02.bin Normal file

Binary file not shown.

32
programs/prog04.asm Normal file
View File

@@ -0,0 +1,32 @@
//
// prog04.asm -- call/ret with args, and with ret value
//
asf 3
pushc 11
wrint
pushc '\n'
wrchr
pushc 11
pushc 33
call proc
drop 2
pushr
wrint
pushc '\n'
wrchr
pushc 33
wrint
pushc '\n'
wrchr
rsf
halt
proc:
asf 2
pushl -3
pushl -4
sub
popr
rsf
ret

31
programs/prog1.asm Normal file
View File

@@ -0,0 +1,31 @@
//
// prog1.asm -- an assembler example with global variables
//
// global Integer x;
// global Integer y;
// x = 2;
// y = x + 3;
// x = 7 * y + x;
// writeInteger(x + -33);
// writeCharacter('\n');
pushc 2
popg 0
pushg 0
pushc 3
add
popg 1
pushc 7
pushg 1
mul
pushg 0
add
popg 0
pushg 0
pushc -33
add
wrint
pushc '\n'
wrchr
halt

View File

@@ -0,0 +1,31 @@
//
// prog1.asm -- an assembler example with global variables
//
// global Integer x;
// global Integer y;
// x = 2;
// y = x + 3;
// x = 7 * y + x;
// writeInteger(x + -33);
// writeCharacter('\n');
pushc 2
popg 0
pushg 0
pushc 3
add
popg 1
pushc 7
pushg 1
mul
pushg 0
add
popg 0
pushg 0
pushc -33
add
wrint
pushc '\n'
wrchr
halt

BIN
programs/prog1.bin Normal file

Binary file not shown.

33
programs/prog2.asm Normal file
View File

@@ -0,0 +1,33 @@
//
// prog2.asm -- an assembler example with local variables
//
// local Integer x;
// local Integer y;
// x = 2;
// y = x + 3;
// x = 7 * y + x;
// writeInteger(x + -33);
// writeCharacter('\n');
asf 2
pushc 2
popl 0
pushl 0
pushc 3
add
popl 1
pushc 7
pushl 1
mul
pushl 0
add
popl 0
pushl 0
pushc -33
add
wrint
pushc '\n'
wrchr
rsf
halt

BIN
programs/prog2.bin Normal file

Binary file not shown.

9
programs/prog3.asm Normal file
View File

@@ -0,0 +1,9 @@
pushc 1
asf 2
asf 4
pushc 23
asf 3
rsf
rsf
rsf
halt

BIN
programs/prog3.bin Normal file

Binary file not shown.

61
programs/prog4.asm Normal file
View File

@@ -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

BIN
programs/prog4.bin Normal file

Binary file not shown.

63
programs/prog5.asm Normal file
View File

@@ -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

BIN
programs/prog5.bin Normal file

Binary file not shown.

61
programs/prog6.asm Normal file
View File

@@ -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

17
programs/prog7.asm Normal file
View File

@@ -0,0 +1,17 @@
//
// prog04.asm -- call/ret with args, and with ret value
//
pushc 12
rdint
mul
wrint
call proc
halt
proc:
asf 1
pushc '\n'
wrchr
rsf
ret

BIN
programs/prog7.bin Normal file

Binary file not shown.

55
record.c Normal file
View File

@@ -0,0 +1,55 @@
//
// Created by Nils Polek on 23.01.24.
//
#ifndef RECORD
#define RECORD
#include "stackslot.c"
#include "instruktion.c"
ObjRef newRecord(int size){
ObjRef record;
unsigned int objSize;
objSize = sizeof(*record) + (size * sizeof(void *));
if((record = malloc(objSize)) == NULL){
perror("malloc");
}
record->size = MSB;
record->size = record->size + size;
for(int i = 0; i < size; i++) {
GET_REFS_PTR(record)[i] = NULL;
}
return record;
}
int getSize(ObjRef arr){
if(arr == NULL) return 0;
return GET_ELEMENT_COUNT(arr);
}
ObjRef getField(ObjRef arr, int point){
if(arr == NULL) perror("Record is null");
if(0 > point || point > getSize(arr)){
printf("Index %i out of bounds for length %i\n",point, getSize(arr));
}
return *(ObjRef *)GET_REFS_PTR(arr)[point]->data;
}
void setField(ObjRef arr, int point, ObjRef value){
bool isNull = false;
if(value == NULL) isNull = true;
if(0 > point || point >= getSize(arr)){
printf("Index %i out of bounds for length %i\n",point, getSize(arr));
exit(EXIT_FAILURE);
}
if(arr == NULL) perror("Record is null");
if(IS_PRIMITIVE(arr)) perror("Record is a primitive");
int size;
if (isNull) size = sizeof(void *);
else {
if (IS_PRIMITIVE(value))
size = value->size;
else
size = sizeof(*value) + (GET_ELEMENT_COUNT(value) * sizeof(void *));
}
if((GET_REFS_PTR(arr)[point] = malloc(size)) == NULL) perror("malloc");
GET_REFS_PTR(arr)[point] ->size = size;
* (ObjRef *)GET_REFS_PTR(arr)[point]->data = value;
}
#endif

81
stack.c Executable file
View File

@@ -0,0 +1,81 @@
//
// Created by Nils on 29.10.2023.
//
#ifndef STACK
#define STACK
#include <stdio.h>
#include <stdlib.h>
#include "stackslot.c"
struct stack {
int* size;
int* current;
StackSlot *stack;
};
typedef struct {
unsigned int size;
ObjRef *refs;
}ObjRefContainer;
void printStack(struct stack stack, int fp) {
printf("Stack\nSize:\t\t%i\nCurrent:\t%i\n", *stack.size, *stack.current);
for (int i = *stack.current -1; i >= 0; --i) {
printf("%i\t",i);
if(stack.stack[i].u.objRef == NULL) printf("|NULL|");
else
if(stack.stack[i].isObjRef){
printf("|%p|", (void *)stack.stack[i].u.objRef);
if(stack.stack[i].u.objRef->size == sizeof(int))
printf("(%i)",*(int *)stack.stack[i].u.objRef->data);
}else {
printf("|%i|", getIntValfromStackSlot(stack.stack[i]));
}
if(fp == i) printf("<-\tFP\n");
else if(*stack.current == i) printf("<-\tSP\n");
else printf("\n");
}
}
//ObjRefContainer getRefs(struct stack stack){
// ObjRefContainer continer;
// int counter = 0;
// for (int i = 0; i <= *stack.current; i++) {
// if(stack.stack[i].isObjRef == true) counter++;
// }
// continer.size = counter;
// ObjRef *list = (ObjRef *)malloc(counter * sizeof(ObjRef));
// for (int i = 0; i<= *stack.current; i++)
// if(stack.stack[i].isObjRef == true)
// list[counter--] = stack.stack[i].u.objRef;
// continer.refs = list;
// return continer;
//}
void push(struct stack s, StackSlot value) {
if (*s.current >= *s.size) {
printf("Stack Overflow\n");
exit(EXIT_FAILURE);
}
s.stack[*s.current] = value;
*s.current=*s.current + 1;
}
StackSlot pop(struct stack s) {
if (*s.current == 0) {
printf("Stack Underflow\n");
exit(EXIT_FAILURE);
}
*s.current = *s.current -1;
return s.stack[*s.current];
}
int peek(struct stack s, int steps) {
if (*s.current - steps < 0) {
printf("Stack Underflow\n");
exit(EXIT_FAILURE);
}
return getIntValfromStackSlot(s.stack[*s.current - steps]);
}
#endif

66
stackslot.c Normal file
View File

@@ -0,0 +1,66 @@
#ifndef STACKSLOT
#define STACKSLOT
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "objref.c"
typedef int Object;
typedef struct {
bool isObjRef;
union {
ObjRef objRef;
int number;
} u;
} StackSlot;
ObjRef getIntObj(int val) {
ObjRef intObject;
unsigned int objSize = sizeof(ObjRef) + sizeof(int);
if ((intObject = malloc(objSize)) == NULL) {
perror("malloc");
}
*(int *) intObject->data = val;
intObject->size = objSize;
return intObject;
}
int getValFromIntObj(ObjRef iref) {
if (iref == NULL) perror("ObjRef is null");
return *(int *) iref->data;
}
int getIntValfromStackSlot(StackSlot s) {
if (s.isObjRef) {
return *(int *) s.u.objRef->data;
}
return s.u.number;
}
void setValIntObj(ObjRef iref, int val) {
if (iref == NULL) perror("ObjRef is null");
iref->size = sizeof(int)+sizeof(ObjRef);
*(int *) iref->data = val;
}
StackSlot stackSlotWithObjRef(ObjRef val) {
StackSlot *stackSlot;
stackSlot = malloc(sizeof(StackSlot));
if(stackSlot == NULL) perror("malloc");
stackSlot->isObjRef = true;
stackSlot->u.objRef = val;
return *stackSlot;
}
StackSlot stackSlotWitchNumber(int val) {
StackSlot *stackSlot;
stackSlot = malloc(sizeof(StackSlot));
if(stackSlot == NULL) perror("malloc");
stackSlot->isObjRef = false;
stackSlot->u.number = val;
return *stackSlot;
}
#endif

28
support.c Normal file
View File

@@ -0,0 +1,28 @@
#include "support.h"
#include <stdio.h>
#include <stdlib.h>
#include "objref.c"
void fatalError(char *msg){
printf("Fatal error: %s\n", msg);
exit(1);
}
void * newPrimObject(int dataSize) {
ObjRef bigObjRef;
bigObjRef = malloc(sizeof(unsigned int) +
dataSize * sizeof(unsigned char));
if (bigObjRef == NULL) {
fatalError("newPrimObject() got no memory");
}
bigObjRef->size = sizeof(unsigned int) + dataSize * sizeof(unsigned char);
return bigObjRef;
}
void * getPrimObjectDataPointer(void * obj){
ObjRef oo = ((ObjRef) (obj));
return oo->data;
}

BIN
support.o Normal file

Binary file not shown.

155
test.asm Normal file
View File

@@ -0,0 +1,155 @@
//
// version
//
.vers 7
//
// execution framework
//
__start:
call _main
call _exit
__stop:
jmp __stop
//
// Integer readInteger()
//
_readInteger:
asf 0
rdint
popr
rsf
ret
//
// void writeInteger(Integer)
//
_writeInteger:
asf 0
pushl -3
wrint
rsf
ret
//
// Character readCharacter()
//
_readCharacter:
asf 0
rdchr
popr
rsf
ret
//
// void writeCharacter(Character)
//
_writeCharacter:
asf 0
pushl -3
wrchr
rsf
ret
//
// Integer char2int(Character)
//
_char2int:
asf 0
pushl -3
popr
rsf
ret
//
// Character int2char(Integer)
//
_int2char:
asf 0
pushl -3
popr
rsf
ret
//
// void exit()
//
_exit:
asf 0
halt
rsf
ret
//
// void writeString(String)
//
_writeString:
asf 1
pushc 0
popl 0
jmp _writeString_L2
_writeString_L1:
pushl -3
pushl 0
getfa
call _writeCharacter
drop 1
pushl 0
pushc 1
add
popl 0
_writeString_L2:
pushl 0
pushl -3
getsz
lt
brt _writeString_L1
rsf
ret
//
// void main()
//
_main:
asf 2
new 2
popl 1
pushl 1
pushc 5
putf 0
pushl 1
getf 0
popl 0
pushl 1
pushc 2
pushl 0
mul
putf 1
pushl 1
getf 0
call _writeInteger
drop 1
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
pushl 1
getf 1
call _writeInteger
drop 1
pushc 1
newa
dup
pushc 0
pushc 10
putfa
call _writeString
drop 1
__0:
rsf
ret

3
test.nj Normal file
View File

@@ -0,0 +1,3 @@
void main(){
}

BIN
test/.DS_Store vendored Normal file

Binary file not shown.

BIN
test/tests/1.bin Normal file

Binary file not shown.

BIN
test/tests/10.bin Normal file

Binary file not shown.

BIN
test/tests/11.bin Normal file

Binary file not shown.

BIN
test/tests/12.bin Normal file

Binary file not shown.

BIN
test/tests/13.bin Normal file

Binary file not shown.

BIN
test/tests/14.bin Normal file

Binary file not shown.

BIN
test/tests/15.bin Normal file

Binary file not shown.

BIN
test/tests/2.bin Normal file

Binary file not shown.

BIN
test/tests/3.bin Normal file

Binary file not shown.

BIN
test/tests/4.bin Normal file

Binary file not shown.

BIN
test/tests/5.bin Normal file

Binary file not shown.

BIN
test/tests/6.bin Normal file

Binary file not shown.

BIN
test/tests/7.bin Normal file

Binary file not shown.

BIN
test/tests/8.bin Normal file

Binary file not shown.

BIN
test/tests/9.bin Normal file

Binary file not shown.

18
test/tests/arrTest.asm Normal file
View File

@@ -0,0 +1,18 @@
new 3
popg 0
pushg 0
pushc 10
putf 0
pushg 0
pushc 11
putf 1
pushg 0
getf 0
pushg 0
getf 1
add
wrint
halt
// Sollte 10 + 11 ergeben

View File

@@ -0,0 +1,13 @@
asf 5
pushc 11
call x
wrint
rsf
halt
x:
asf 3
pushc 22
wrint
rsf

View File

@@ -0,0 +1,125 @@
//
// version
//
.vers 7
//
// execution framework
//
__start:
call _main
call _exit
__stop:
jmp __stop
//
// Integer readInteger()
//
_readInteger:
asf 0
rdint
popr
rsf
ret
//
// void writeInteger(Integer)
//
_writeInteger:
asf 0
pushl -3
wrint
rsf
ret
//
// Character readCharacter()
//
_readCharacter:
asf 0
rdchr
popr
rsf
ret
//
// void writeCharacter(Character)
//
_writeCharacter:
asf 0
pushl -3
wrchr
rsf
ret
//
// Integer char2int(Character)
//
_char2int:
asf 0
pushl -3
popr
rsf
ret
//
// Character int2char(Integer)
//
_int2char:
asf 0
pushl -3
popr
rsf
ret
//
// void exit()
//
_exit:
asf 0
halt
rsf
ret
//
// void writeString(String)
//
_writeString:
asf 1
pushc 0
popl 0
jmp _writeString_L2
_writeString_L1:
pushl -3
pushl 0
getfa
call _writeCharacter
drop 1
pushl 0
pushc 1
add
popl 0
_writeString_L2:
pushl 0
pushl -3
getsz
lt
brt _writeString_L1
rsf
ret
//
// void main()
//
_main:
asf 0
pushc 4421
pushc 5743
mul
pushc 7699
mul
call _writeInteger
drop 1
__0:
rsf
ret

Some files were not shown because too many files have changed in this diff Show More