Ijvm

Ijvm ist ein Assembler-Sprache erstellt von Andrew S. Tanenbaum umgesetzt Mikroarchitektur MIC-1. Eine solche Sprache ist auf der Vermittlung grundlegender in seinem Buch "Rechnerarchitektur" angenommen.

Ijvm ist eine Vereinfachung des in der JVM Java-Plattform verwendete Sprache. Die Sprache wird in einem solchen Ausmaß, daß es sehr schwierig machen, um Programme sehr komplex schreiben vereinfacht.

Speicherorganisation in ijvm

Der Speicher in ijvm wird als ein Array von 4294967296 1,073,741,824 Bytes oder Wörter von jeweils 4 Bytes konzipiert. Dieser Speicher verwaltet und von Zeigern indiziert falls dh Protokolle Mikro MIC-1, die vier unterschiedliche Speicherbereiche abgrenzen:

Konstante Teil des Speichers

Dieser Bereich nicht das Schreiben auf dem Programm ijvm ermöglichen. Die hier geladenen Daten können nur geschrieben werden, wenn das Programm in den Speicher gebracht. Die Adresse des ersten Wortes des Abschnitts des Speichers wird in dem Register CPP enthalten.

Block von lokalen Variablen

In diesem Speicherblock leben lokalen Variablen der genannten Verfahren, zusätzlich zu den Parametern, mit dem es aufgerufen wurde. Die Adresse der ersten Speicherstelle in diesem Bereich wird in impliziter LV protokolliert.

Stapel von Operanden

Unmittelbar oberhalb der Variable Rahmen implementiert, finden wir einen Speicherblock, der die Operanden der verschiedenen Operationen innerhalb einer Methode durchgeführt enthält. Obwohl Stapeloperanden durch den variablen Rahmen unterteilt sind, werden die beiden Blöcke als einen Stapel ausgelegt. Die Adresse des Wortes am Anfang der Stapel wird von der SP-Register, das berücksichtigt damit die Operanden eingesetzt oder entnommen wird spitz.

Bereich Methoden

In diesem Bereich das Programm liegt ijvm durchzuführen. Die Adresse der nächsten Anweisung, die abgerufen werden, wird in der PC-Registrierung enthalten. Dieser Bereich, anstatt als ein Array von Wörtern wie die anderen Speicherbereiche behandelt, wird der als ein Array von Bytes gedacht.

Aufgrund der Struktur der Constant Pool Worten, die Variable Frame and Stack von Operanden und ein Byte des Flächenverfahrens, sei darauf hingewiesen, daß der Versatz durch die Aufzeichnungen CPP, LV und SP sind auf die Zahl der Wörter basiert angezeigt, während diejenigen, die durch gegebene PC beziehen sich auf Zahlen von Bytes. Zum Beispiel mit der Notation "LV + 3" zeigt das dritte Wort des variablen Rahmen, während "PC + 4 'zeigt die 4 Bytes ab Byte, auf das PC.

Anleitung ijvm

Die Anweisungen ijvm aus einem Operationscode und in manchen Fällen einen Operanden, der eine Konstante oder eine Verschiebung kann sich zusammensetzen.

In der ersten Spalte ist der Mnemonik in Assembler, der zweiten und dritten Operanden eine kurze Beschreibung der Bildung.

Beschreibung oper

  • Byte: Eine Zahl oktal, dezimal oder hexadezimal.
  • Markenname: Ein eindeutiger String.
  • Variablenname: Eine eindeutige Zeichenfolge.
  • Constant Name: Ein eindeutiger String.
  • Methodenname: Ein eindeutiger String.
  • N / A: Ausbildung keine Operanden.


Einige dieser Anweisungen können Sie ein Wort im Stapel aus unterschiedlichen Quellen, wie zum Beispiel den Block von lokalen Variablen, Konstanten-Pool und Bildung selbst einfügen.

Jede Variable kann von der Oberseite des Stapels entnommen und in den Block der lokalen Variablen gespeichert werden. Es ist auch erlaubt, ausgeführt, wobei als Operanden die beiden Wörter, die an der Oberseite des Stapels, dh Verknüpfungsoperationen und Operationen aritmetiche.In sämtliche logischen und arithmetischen Operationen extrahiert und dann gelöscht wird, von der Oberseite des Stapels und die beiden Worte ihre Ergebnisse.

Es gibt auch vier Befehle für Sprünge, eine unbedingte drei condizionate.Tutte diese Anweisungen, wenn angenommen wird, ändern Sie den Wert des PC, je nach Größe der Verschiebung.

Schließlich gibt es Bildungs ​​invokevirtual, ein neues Verfahren und Bildung IRETURN, um das Verfahren zu beenden und die Steuerung zu dem, der gerufen hatte aufzurufen.

Beispiel Unterrichts: invokevirtual

Das Verfahren für den Aufruf der Methoden ist das folgende: Zunächst tritt das Verfahren in Anrufers auf dem Stapel ein Zeiger genannt OBJREF, die auf das Objekt verweist zu nennen, später fügt die Verfahrensparameter auf den Stapel und wird schließlich ausgeführten Befehl invokevirtual. Diese Anweisung schließt eine Verschiebung, die eine Speicherstelle innerhalb des Constant Pool enthält die Adresse, in welcher Weise startet die Methode, die Sie aufrufen werden.

Die ersten 4 Bytes in den Verfahren enthalten spezielle Daten, die wie folgt sind:

Die ersten 2 Bytes werden als 16-Bit-Ganzzahl, die die Anzahl der Parameter der 16-Bit-Integer metodo.Questo stellt zusammen mit dem Wert von SP Anmietung OBJREF interpretiert.

Die nächsten 2 Byte immer als ein 16-Bit-Ganzzahl, die anzeigt, interpretiert jedoch die Blockgröße der lokalen Variablen der Methode aufgerufen. Dieser Wert ist von grundlegender Bedeutung, weil sie einen neuen Stapel für das Verfahren unmittelbar über den Block der lokalen Variablen zu erstellen.

Schließlich enthält das fünfte Byte die erste Operationscode auszuführen.

Die tatsächliche Folge von Operationen, die stattfinden, wenn ein Befehl ausgeführt wird invokevirtual ist die folgende.

  • Die 2-Byte unsigned OPCODE Im Folgenden werden verwendet, um einen Index für die Constant Pool zu bauen. Die Instruktion berechnet die Basisadresse des neuen Blocks von Variablen, die den Stapelzeiger durch Subtraktion der Anzahl der Parameter und Einstellen des LV Registers zeigen auf objRef.
  • OBJREF mit der Speicheradresse des alten PC überschrieben. Diese Adresse wird durch Addieren der in der LV mit der Blockgröße der lokalen Variablen enthaltenen Adresse berechnet.
  • Unmittelbar oberhalb der Adresse, in der die alten PC zu speichern ist die Adresse, an die gespeichert werden müssen die alte LV.
  • Noch oberhalb dieser Adresse beginnt für die Methode, die chiamato.SP ist auf dem alten LV, das die Adresse unmittelbar unter dem ersten freien Speicherplatz des Stapels Punkt war zu stapeln. Denken Sie daran, dass SP zeigt immer auf das Wort auf dem Stapel, wenn der Stapel leer ist, dann zeigt auf der ersten Stelle in der Ende des Stapels.
  • Der letzte Schritt ist, um den PC auf den fünften Bytes im Code des Verfahrens darauf gesetzt ist, dann beenden Ausführung invokevirtual.

Bildung IRETURN kehrt die Folge von Operationen, die von invokevirtual durchgeführt, freigibt den von der Methode mit dem Namen invokevirtual bringt den Stapel in den vorherigen Zustand mit Ausnahme der Tatsache, dass verwendet:

  • OBJREF und alle Parameter wurden aus dem Stapel entnommen
  • Rückgabewert der Methode ist, um den Stapel an der Stelle, die zuvor von OBJREF besetzten aufgenommen

Wenn Bildung IRETURN speichert den alten Zustand, sollte in der Lage, auf ihre vorherigen Werte zurückzugeben registriert PC und LV. Es greift auf die Verbindungszeiger, dh das Wort, auf den registrieren LV Strom. Dieses Wort und seinem übergeordneten Verzeichnis abgerufen und verwendet werden, um ihre alten Werte in die Register PC und LV zurückzukehren.

  • SP zurückgesetzt, um auf die Oberseite des Stapels, die der durch das Verfahren zurückgeführt wird zeigen.
  • Wird die Steuerung an den nächsten Befehl als invokevirtual zurückgegeben.

Umsetzung ijvm von MIC-1-

Die folgende Tabelle zeigt die Firmware in Mic-1, die ijvm interpretieren können. Man kann sich leicht merken, wie viel es ist kurz, da sie insgesamt nur 112 Anweisungen. Jedes der Befehle in der Tabelle ist in 3 Säulen, die das Etikett, der eigentliche Code zu verwenden und ein kurzer Kommentar beschreiben unterteilt.

Die Register CPP, LV und SP werden verwendet, um den konstanten Teil des Speichers, den Block der lokalen Variablen und der Oberseite des Stapels zu speichern, bzw. die Zeiger.

  • PC hält die Adresse des nächsten Bytes aus dem Fluss der Bildung entfernt werden.
  • MBR ist ein 1-Byte-Register, die nacheinander Bytestrom Bildung hält aus dem Speicher in der Lage zu interpretieren.
  • TOS enthält den Wert von SP, die das Wort, das an der Spitze des Stapels ist spitz.
  • OPC ist eine temporäre Adresse, in der Regel verwendet, um den alten PC zu speichern.

Jedes dieser Register enthält immer einen bestimmten Wert. Zum Beispiel der Anfang und das Ende jedes Befehls enthält TOS den Wert im SP ausgeführt, oder das Wort, das in der Spitze des Stapels ist. In der Tat kann dieses Wort zu jeder Zeit aus dem Speicher gelesen werden, aber mit ihm in einem Register speichert eine Referenz auf Speicher. Für einige Anweisungen beizubehalten TOS setzt eine größere Nutzung von Speicheroperationen, wie beispielsweise die Befehls POP, die aus dem Speicher auf dem Stapel gelesen das neue Wort, bevor es innerhalb TOS kopiert werden muss.

Wie alle Künstler, hat diese Mikro eine Hauptschleife, die sammelt, decodiert und führt die Anweisungen des Programms durchgeführt werden, die in diesem besonderen Fall sind die Anweisungen ijvm. Der Zyklus beginnt mit der Zeile markiert Main1. Weil der Zyklus beginnt, muss die Bedingung, dass die PC-Registry ist bereits mit einer Adresse der Speicherstelle, die den Opcode, die wiederum sollten bereits im MBR gespeichert beladen ist.

Zu Beginn von jedem Befehl führt dieselbe Abfolge von Operationen, und es ist wichtig, daß die Länge dieser Sequenz so kurz wie möglich ist. Nach zahlreichen Studien wurde geschlossen, dass die Hauptschleife kann auf einen einzigen Befehl reduziert werden. Immer wenn dieser Befehl ausgeführt wird den Operationscode ijvm ausgeführt werden soll, bereits in dem MBR.

An dieser Stelle müssen Sie in Microcode zu springen, um die Anweisung auszuführen ijvm sowie dem Start der Zurücknahme der Byte nach dem Opcode.

Aber wir dürfen nicht vergessen, dass die Anweisungen nicht sequentiell ausgeführt, aber jeder von ihnen ist verpflichtet, ausdrücklich, sein Nachfolger. Müssen alle Speicheradressen, die den OP-Codes für das erste Wort des entsprechenden Befehls-Interpreter reserviert werden, so zum Beispiel der Code, der POP interpretiert beginnt 0x57, während der DUP beginnt zu 0x59. Der Code des POP ist jedoch lang 3 Mikrobefehlen, und deshalb, wenn es in der folgenden Wörter gespeichert werden, würde mit dem Beginn der DUP stören. Innerhalb jeder Sequenz der Mikrobefehl nach der ersten sollte man in den Speicherplätzen noch frei gelagert werden, ist nicht nur in der Befehlscodes. Dafür benötigen Sie, um viele Sprünge von einem Speicherort zu einem anderen zu machen.

Zu sehen, wie der Interpret, gehen wir davon aus, dass der MBR enthält den Wert 0x60, der der Operationscode IADD ist. In der Hauptschleife erscheinen drei Aktionen:

  • Inkrement PC, so dass er die Adresse des ersten Bytes nach dem Opcode.
  • Wir nehmen das nächste Byte, innerhalb des MBR zu bringen.
  • Frühere Main1 Durchführung einer Filiale an die im MBR-Adresse.

Den Widerruf der nächsten Byte beginnt bei diesem Punkt, so dass er sich an dem Beginn des dritten Mikrobefehl. Wenn die im MBR-Byte wird nur 0 gebildet wird, dann identifiziert die Betriebscode des NOP. In diesem Fall wird der Befehl nichts, sondern eine direkt an den Anfang der Hauptschleife, wobei die Sequenz unter Verwendung des neuen Code in MBR gespeichert wiederholt. Schließlich erinnern, dass die Mikrobefehle, die in der Tabelle nicht aufeinanderfolgend in dem Speicher gespeichert, dann Main1 nicht in der Adresse 0 des Speichers gefunden. Und "Aufgabe microassemblatore platzieren Sie die Mikrobefehle in geeignete Adressen und verbinden sie in kurzen Schüben über das Feld NEXT_ADDRESS.

  0   0
Vorherige Artikel Magnetische Deklination
Nächster Artikel Fantozzi im Paradies

In Verbindung Stehende Artikel

Kommentare - 0

Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha