JavaScript/Von-Neumann-Rechner-Simulation

Aus ZUM-Unterrichten

Von-Neumann-Rechner-SimulatorenWikipedia-logo.png gibt es sehr viele. Selten bekommt man jedoch Gelegenheit, selbst den Quellcode sehen zu können und zusätzliche Befehle einbauen zu können.

Die folgende Simulation ermöglicht es, in JavaScript kleine Maschinensprachenprogramme auf einem sehr einfachen Rechner zu simulieren.

  • Der Befehlssatz wurde - leicht variiert - von folgender Simulation übernommen: [1]

Übung
  • Analysieren Sie das Programm
  • Ergänzen Sie die fehlenden Befehle
  • Schreiben Sie kleine Anwendungen in Maschinensprache und testen Sie sie mit Hilfe des Simulators.


<script>
 /*
 0 -	COMPARE X Y	Vergleiche (X) und (Y)
 		PS:=0 falls (X)=(Y)
 		PS:=1 falls (X)>(Y)
 		PS:=-1 falls (X)<(Y)
 1 -	IF= X	Falls PS=0 springe an die Adresse X
 2 -	IF> X	Falls PS>0 springe an die Adresse X
 3 -	IF< X	Falls PS<0 springe an die Adresse X
 4 -	SUB X Y	(X):=(X)-(Y)
 5 -	JMP X	Springe an die Adresse X
 6 -	OUT X	Ausgabe von (X)
 7 -	END	Ende
 
 8 -	INP X	Eingabe von (X)
 9 -	ADD	(X):=(X)+(Y)
 10 -	MUL	(X):=(X)*(Y)
 11 -	DIV	(X):=(X)/(Y)
 12 -	MOD	(X):=(X)MOD(Y)
 
 zusätzlich
 13 - dump - gibt die Werte aller Speicherplätze aus
 */
 
 var a=new Array();
 var ps=new Number();
 var zaehler=new Number();
 var nothalt=new Number();
 zaehler=0; 
 nothalt=0; // spätestens nach 1000 Schritten wird das Prg unterbrochen
 a[ 0]="inp";
 a[ 1]="10";
 a[ 2]="out";
 a[ 3]="10";
 a[ 4]="add";
 a[ 5]="10";
 a[ 6]="9";
 a[ 7]="jmp";
 a[ 8]="2";
 a[ 9]="1";
 a[10]="0"; 
 
 while (a[zaehler]!="end" && nothalt<1000){  
  document.write(a[zaehler]+"<br>");  
 // inp ZELLE - ermöglicht eine Benutzereingabe
 // der Wert wird in ZELLE gespeichert
 if (a[zaehler]=="inp") {
  zaehler++;
  a[a[zaehler]]=prompt("Bitte eine Zahl eingeben");
 }
 // out ZELLE
 // gibt den Wert von ZELLE aus.
 if (a[zaehler]=="out") {
  zaehler++;
  document.write(a[a[zaehler]]+" --- ");
 }  
 // add ZELLE1 ZELLE2 - addiert zum Wert der Zelle1 den Wert von ZELLE2
 // speichert ihn in Zelle
 if (a[zaehler]=="add") {
  zaehler++;
  a[a[zaehler]]=Number(a[a[zaehler]])+Number(a[a[zaehler+1]]);
  zaehler++;
 } 
 // jmp ZELLE
 // setzt den Zähler auf den Wert ZELLE (springt im Programm)
 if (a[zaehler]=="jmp") {
  zaehler++;
  zaehler=a[zaehler]-1;
 }
 // dump - gibt den Wert von allen Speicherzellen aus.
 if (a[zaehler]=="dump") {
  for (i=0;i<a.length;i++) {
    document.write(i+"-"+a[i]+" --- ");
  } 
 }
  zaehler++;
  nothalt++;
 }
 
 if (nothalt==1000) { // nach spätestens 1000 Schritten stoppt das Programm
    alert("(Wahrscheinlich) Programmstopp durch Nothalt");
 }
 </script>
}}

Siehe auch

Hintergrundwissen