nanoController :D
-
ich stell mir grad die frage wie so ein unheimlich minimaler microprozessor aussehen könnte (anzahl register, befehle...)
also prinzipiell würd ich mal sagen 8bit als minimum und ein port als input und einer als output.
die zahl der register ist eigentlich beliebig wählbar (viliecht 16 damit man in ein byte genau 2 registernummern reinbringt für die opcodes?)
eines davon ist einfach als der codepointer definiert (sprungbefehle können als einfaches mov implementiert werden)
dann kommt man etwa zu folgenden befehlen:mov register, register
mov register, konstante
add register, register
sub register, register
cmp register, register
breq (branch if equal -> nächsten befehl überspring oder nicht)
brgr (branch if greater -> nächsten befehl überspring oder nicht)
brlo (branch if lower -> nächsten befehl überspring oder nicht)
in register
out registerman könnte e.v. noch dem cmp befehl weglassen und direkt in die branch befehle einbauen.
hat wer andere/weitere ideen? (ausser brainfuck
)
-
du könntest ein paar Befehle hardcoed auf den Prozsssor einbauen
wär aber extrem hart
Sprungbefehle:
meinst du
mov Sprunmarke
dann könntest du noch in den mov Befehle folgendes intrgierenmov Funktion
springt zur Funktion und kehr nach Beendigung der Funktion zur Zeile nach dem mov zurück
-
Also ein absolut minimaler Prozessor der trotzdem alles berechnen können soll braucht nur einen Befehl:
OISC by Ross Cunniff
One Instruction Set Computer. A play on RISC (Reduced Instruction Set Computer). The only instruction is Subtract and Branch if Negative. Its operands are three addresses, X, Y, and Z. This instruction subtracts the number at address Y from the number at address X, stores the result at address X, and if the result is negative, branches to address Z. (Ross Cunniff Hewlett-Packard Graphics Software Lab cunniff@fc.hp.com DISCLAIMER: HP would be bankrupt if I worked in the CPU design division...)Ergo: 8 Bit Adress/Datenbus, I/O kann in den Speicher gemappt werden. Da es nur einen Befehl gibt brauchst du keine Befehlsdecodierung und nichtmal ein Register (aus Programmierersicht, natürlichs chon aus interner Sicht). Das wäre wirklich simpel. Aber viel Spaß beim Programmieren
-
Wenn Minimalismus, dann eine Turingmaschine.
-
Hauptmann schrieb:
Sprungbefehle:
meinst du
mov Sprunmarkenö, is ein bisschen anderse gemeint. die position an der das programm gerade abgearbeitet wird ist ja einfach ein pointer in den speicher und die jmp befehle auf normalen prozessoren setzen diese register einfach auf die adressen der sprungmarke... aber wenn man per mov auf den code pointer zugreiffen kann dann kamm man sich die sprungbefehle sparen...
das wär dann halt sowas in der art:
mov codepoointer, Sprungmarke
-
Verstehe irgendwie nicht ganz, was diese andere Schreibweise bringen soll.
"jmp Dest" und "mov ip,dest" bewirken das selbe. (selber OpCode - unterschiedliche Mnemonics)
"jmp Dest" finde ich aber einfach praktischer=>man sieht auf einen Blick, dass hier zu einer anderen Stelle im code gesprungen werden soll, was bei "mov ip,dest" nicht unbedingt der Fall ist.Um es nochmal deutlich zu sagen:
Wenn du statt "jmp Dest" "mov ip,dest" schreibst, sparst du gar nichts!
-
Um es nochmal deutlich zu sagen:
Wenn du statt "jmp Dest" "mov ip,dest" schreibst, sparst du gar nichts!ich habe ja eigentlich nur darauf hingeweisen, dass man sich einen prozessorbefehl für einen sprung sparen kann, wenn man per mov in den codepointer schreiben darf (alle architekturen die ich bisher gesehen habe haben extra befehle für sprünge)... klar ein assembler könnte trozdem noch das mnemonic jmp kennen, aber er übersetzt es ja dann trotzdem in ein mov.
-
dafür must du die ansprechbare Registerliste um den ip erweitern und verlierst so eins von deinen
16 general purpose Registern. Diese sind glaube ich vom Wert höher einzuschätzn als eine gesparter
Befehl. Die Zahl 16 kam von dir damit 2 Register in ein Byte passen.An die Turing Antwort traut sich wohl keiner ran
Bei Add und Sub bietet sich auch eine 3 Register Lösung an:
add INregister1, INregister2, OUTregister
add INregister1, INregister2, OUTregister
Dies könnte auch für andere deiner Befehle gelten.Hab so eine Lösung im Bereich der Signalprocesoren gesehen, führt dort zu einer hohen Mathe-lesitung
-
PAD schrieb:
An die Turing Antwort traut sich wohl keiner ran
Das unendlich Band ist so unpraktisch
Aber ansonsten dürfte das Ding nicht allzukomplex sein
Bei Add und Sub bietet sich auch eine 3 Register Lösung an:
add INregister1, INregister2, OUTregister
add INregister1, INregister2, OUTregister
Dies könnte auch für andere deiner Befehle gelten.Hab so eine Lösung im Bereich der Signalprocesoren gesehen, führt dort zu einer hohen Mathe-lesitung
Unbedingt, nicht nur Mathe-Leistung. Wer mal x86 udn Sparc assembelr programmiert hat, weiß was für ein Vorteil solche Befehle sind.
-
Die Frage war:
ich stell mir grad die frage wie so ein unheimlich minimaler microprozessor aussehen könnte (anzahl register, befehle...)
Meine Antwort ist da immer noch Turing.
ob das die sinnvollste Implementierung ist, ist eine ander Frage, vielleicht sollte man den zweiteinfachsten Processor bauen.
Außerdem steht ja auch unheimlich in der Frage.
-
PAD schrieb:
Die Frage war:
ich stell mir grad die frage wie so ein unheimlich minimaler microprozessor aussehen könnte (anzahl register, befehle...)
Meine Antwort ist da immer noch Turing.
Die minimalste ist immernoch der ONE INSTRUCTION SET COMPUTER (s.o
). Keine Befehlsdecodierung, man braucht intern drei Register (IP, OpA, OpB), eine Subtraktionseinheit (OpA-OpB), einen Inkrementer für IP. Ein Befehl. Das Ding soltle sich grob auf eine Schriebtischunterlage zeichnen lassen
Für eine Turingmaschine brauchst du da mehr
-
Gebe mich geschlagen habe OISC als RISC gelesen und nicht weiter beachtet.
PS und das funktioniert?
-
PAD schrieb:
Gebe mich geschlagen habe OISC als RISC gelesen und nicht weiter beachtet.
PS und das funktioniert?
jop, soll turing-vollständig sein