Hier ist die Lösung der Aufgabe vom ersten Teil des Kurses:

subi:
#if DEBUG
printf ("%lli SUBI\n", cpu_core);
#endif
arg1 = code[ep + 1];
arg2 = code[ep + 2];
arg3 = code[ep + 3];

regi[arg3] = regi[arg1] - regi[arg2];

eoffs = 4;
EXE_NEXT();


muli:
#if DEBUG
printf ("%lli MULI\n", cpu_core);
#endif
arg1 = code[ep + 1];
arg2 = code[ep + 2];
arg3 = code[ep + 3];

regi[arg3] = regi[arg1] * regi[arg2];

eoffs = 4;
EXE_NEXT();


divi:
#if DEBUG
printf ("%lli DIVI\n", cpu_core);
#endif
arg1 = code[ep + 1];
arg2 = code[ep + 2];
arg3 = code[ep + 3];

regi[arg3] = regi[arg1] / regi[arg2];

eoffs = 4;
EXE_NEXT();

Jetzt sind die Befehle für die 4 Grundrechenarten bei Ganzzahlen komplett. Ich erstellte für diesen Kursteil eine neue Funktion mit dem Namen “run”. Dort ist jetzt unser Kern zur Ausführung der Programme.

Neu ist jetzt der Interrupt Teil. Dort wird jetzt die Textausgabe, die vorher im PRINT Befehl war ausgeführt:

intr0:
arg1 = code[ep + 1];
#if DEBUG
printf ("%lli INTR0: %lli\n", cpu_core, arg1);
#endif
switch (arg1)
{
	case 4:
		//printf ("PRINTI\n");
		arg2 = code[ep + 2];
		printf ("%lli", regi[arg2]);
		eoffs = 5;
		break;

	case 7:
		//printf ("PRINTNEWLINE\n");
		printf ("\n");
		eoffs = 5;
		break;

	case 8:
		//	DELAY
		arg2 = code[ep + 2];
		usleep (regi[arg2] * 1000);
		eoffs = 5;
		break;

	case 255:
		printf ("shutdown...\n");
		return (0);
}
EXE_NEXT();

Ein Aufruf in einem Assembler Programm würde für die Ausgabe einer Ganzzahl so aussehen:

intr0 4, 1, 0, 0

Hier wird der Interrupt 4 aufgerufen mit dem 1 Register zur Ausgabe.

Seht einfach mal das komplette Programm des zweiten Teils an, das ist einfacher zu verstehen.

Hier gibt es ein ZIP Archiv mit dem vollständigem Programm:

ZeroVM-02