Ich möchte über den Prozessor sprechen, den ich 2016 entwickelt habe. Es ist in C als virtuelle Maschine implementiert. Mein Freund Björn hat für ihn Assembler in F # geschrieben.
Periwinkle ist im Gegensatz zu RISC und CISC ein
OISC- Prozessor (One Instruction Set Computer). Es gibt kein Pipelining. In der Tat ist Produktivität nicht das Hauptziel des Projekts, es wurde eher zum Vergnügen und zu Bildungszwecken geschaffen.
Meine Freundin Alena hat sich den Namen Immergrün ausgedacht, das heißt Immergrün (diese erstaunlich zähe Blume gilt als Symbol der Vitalität - ca. Per.)
Es gibt viele Arten von Anweisungen für OISC. Aber in Immergrün ist dies eine Bewegung Anweisung. Verschieben Sie das
Literal einfach in ein
Register oder einen Wert von einem Register in ein anderes. Logische und arithmetische Operationen, Verzweigungen usw. unter Verwendung von Registern durchgeführt.
Die Länge des Immergrün-Befehls beträgt stabil 40 Bits. Datenbus 32 Bit.

Immergrün hat insgesamt 64 Register.

Hier ist eine Beschreibung einiger:
Software-Zähler (PC)
- Zähler bis zu 32 Bit
- Die Programmspeichergröße beträgt 255 40-Bit-Wörter (implementierungsabhängig)
- Wenn Sie -1 in das PC-Register verschieben, wird der Zähler explizit angehalten
Allzweckstapel (STK)
- Stapel für alles (16 Ebenen tief)
- Kein Überlaufsignal und unvollständiger Stack
- Das Lesen eines leeren Stapels gibt 0 zurück
- Das Verschieben von Werten ist hier eine Push-Operation
- Umzug von hier - Pop-Operation
Zufallszahlengenerator (RNG)
- Erzeugt beim Aufruf eine zufällige 32-Bit-Zahl
- Hier Werte zu verschieben, erscheint sinnlos
Skip If Zero (SIZ)
- Überspringt die folgende Anweisung, wenn Sie Null darauf setzen
Überspringen, wenn nicht Null (SINZ)
- Überspringt die folgende Anweisung, wenn Sie einen Wert ungleich Null darauf verschieben
Referenz (REF)
- Wird verwendet, um eine Adresse anzugeben, die auf einem verschobenen Wert basiert
- Große Werte werden auf 6-Bit-Zahlen gekürzt.
Differenz (DEF)
- Dereferenzierung nach REF
Reservierte Register (RSV)
- Hierher zu ziehen ist egal. Das Register enthält weiterhin Null.
- Kann für jede Aufgabe verwendet werden, wenn eine virtuelle Maschine auf einen Mikrocontroller oder etwas anderes übertragen wird
- Für zukünftige / zusätzliche Register
- Kann zum Entfernen eines Elements aus dem Mehrzweckstapel und den Betriebsregistern verwendet werden, indem das Element hierher verschoben wird (nicht empfohlen).
- Beim Lesen wird 0 zurückgegeben
Allzweckregister (GPR0-GPR31)
- Kann 32-Bit-Zahlen enthalten
Nullregister
- Kann verwendet werden, um ein Objekt aus dem Mehrzweckstapel und den Betriebsregistern zu entfernen, indem dieses Objekt hierher verschoben wird
- Gibt beim Lesen 0 zurück
Statusregister:
- 0000 0000 0000 0000 0000 0000 000P ZVNC
- Enthält fünf Flags (C, N, V, Z, P)
- Tragen Sie
- Negativ
- Überlauf
- Null
- Das PLUS-Register beeinflusst die Flags C, N, V, Z, P
- Die Register AND, OR, XOR beeinflussen die Flags N, Z, P
- Der zuletzt ausgeführte Vorgang wirkt sich auf das Statusregister aus
- Die Bedeutung hier zu verschieben, scheint sinnlos.
Aber wie funktionieren die PLUS, AND, OR, XOR-Register? Diese vier Register haben einen eigentümlichen Stapel, der eigentlich ein Rechenstapel ist. Wenn der Berechnungsstapel zwei Zahlen enthält, wird die Operation gestartet.

Hier ist ein Beispiel für das PLUS-Register. Das Schema funktioniert ähnlich für die anderen drei Register.
Aber wie führt man arithmetische Operationen mit nur vier Operatoren durch? Wie gesagt, das Ziel dieses Projekts ist Unterhaltung und Bildung. Daher können Sie die fehlenden Aktionen unabhängig voneinander synthetisieren.
Die Subtraktion erfolgt durch Hinzufügen von
zusätzlichem Code , der negative Zahlen darstellt. Ein zusätzlicher Code wird durch Inversion von Bits gebildet, dh durch Drücken auf die Zahl 0xFFFFFFFF (2³²-1) durch XOR. Und eine über das PLUS-Register hinzufügen. Assembler unterstützt jedoch negative Zahlen, sodass dies nicht erforderlich ist.
Die Multiplikation besteht nur aus mehreren Additionen.
Division ist die Häufigkeit, mit der eine einzelne Zahl in eine Zahl eingefügt wird. Dies kann durch den Zähler der sequentiellen Subtraktionen berechnet werden.
Die Bitverschiebung erfolgt durch Multiplizieren mit 2 oder Dividieren mit 2.
Überlegen Sie, wie Sie andere Operationen selbst synthetisieren können.
Bei Interesse finden Sie hier
das Github-Repository einiger Assembler-Programme, die ich für Periwinkle geschrieben habe. Die Verschiebungsanweisung funktioniert von links nach rechts:
#50 gpr0 // 50(base-10) gpr0 gpr0 gpr1 // gpr0 gpr1
Außerdem werde ich versuchen, die ausführbare Datei der virtuellen Periwinkle VM-Maschine hochzuladen. Für welche Plattform soll die virtuelle Maschine arbeiten? (Windows (x86? X86-64?), Linux (x86? X86-64? ARM ?, ARM64 ?, usw.?), Usw.?) Da der Assembler in F # geschrieben ist, kann er wahrscheinlich überall funktionieren , du brauchst nur das
.NET Framework , du kannst dir
Mono anschauen.
Wenn Sie die
Architektur von PIC16 kennen , stellen Sie möglicherweise Ähnlichkeiten mit Periwinkle fest (STATUS, SIZ, SINZ, REF, DEF). Tatsächlich inspirierte es mich, als erste Architektur zu arbeiten, mit der ich begann, in Assemblersprache zu programmieren.