Was ist der minimale Befehlssatz erforderlich für alle Montage-Sprache als nützlich angesehen werden?
Ich studiere Montage der Programmierung im Allgemeinen, also habe ich beschlossen zu versuchen und die Implementierung einer "virtuellen Mikroprozessoren" in der software, die hat Register, flags und RAM mit zu arbeiten, umgesetzt mit Variablen und arrays. Aber da möchte ich simulieren nur die grundlegende Verhalten von jedem Mikroprozessor, ich möchte erstellen Sie eine assembly-Sprache, die nur die wesentlichen Anweisungen, nur diejenigen Anweisungen, ohne die Sie nicht sein konnte nützlich. Ich meine, es gibt assembly Sprachen, die das tun, Multiplikation und Swap register, etc, aber diese Vorgänge sind nicht einfach, weil Sie Sie einsetzen können einfachere Anweisungen. Ich will nicht zu implementieren Anweisungen wie diese.
Kann ich mir vorstellen, ein paar Anweisungen, die (glaube ich) muss immer vorhanden sein, in jeder assembly-Sprache, wie MOV zu bewegen bytes um und JP zum senden der instruction-pointer auf eine andere Adresse.
Könnten Sie vorschlagen, eine Reihe von die meisten grundlegenden und wesentlichen Montageanleitung? Danke!
- siehe stackoverflow.com/q/3711443/309483
- verwandt, aber nicht doppelt. Ein-instruction-set-Computer könnte leicht zu bauen, aber nicht so viel leichter, dass die schrecklichen Leistung würde sich lohnen, dies in der Praxis. Wenn Sie ausschließen Definitionen von "nützlich" wie "nützlich wie ein Beispiel von Turing-Vollständigkeit" und nur als "nützlich für einige real-Welt mit einem hardware-oder VM-Implementierung", dann wird der Mindest-standard für nützlich, die viel höher als die "Turing-vollständig", wenn es um Assembler. Wenn Ihr problem ist also, domain-spezifischen brauchen Sie nicht Turing-Vollständigkeit, Sie brauchen nicht asm.
- es ist wahr, Sie haben Recht. Ich aktualisiert meine Antwort zu berücksichtigen.
- Was ist das absolute minimum Satz von Anweisungen, die erforderlich sind, um zu bauen eine Turing-Prozessor
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, das ist ein sehr breites Thema. Ich nehme an, Sie brauchen, um sich mit Random-Access-Maschine. Ich bin kein Experte, aber es ist schwer zu sagen, welche Anweisungen sollten unterstützt werden durch diese sehr einfachen Mikroprozessor. Zum Beispiel: Subtraktion und Multiplikation kann simuliert werden, indem Neben der Bedienung. Vermehrung ist möglich, wenn der Mikroprozessor unterstützt Sprünge und bedingte Anweisungen und Subtraktion ist möglich durch hinzufügen der negativen Zahl.
Kontrollstrukturen umfassen die grundlegende Eigenschaft, ohne die es keine Sprache. Dies bedeutet, dass Ihre Sprache müssen arithmetische Operationen mit zwei Variablen, und dann ein Programm zum ändern der Programm-Zähler-das heißt, Zweig -- basierend auf dem Ergebnis einer operation. Sehr oft, die entscheidende operation ist SUB, zum subtrahieren eines Operanden von einem anderen. Und die Bedingungen, auf die Sie erlauben würde, eine Filiale sind:
Müssen Sie auch Anweisungen zum verschieben von Daten: LADEN und SPEICHERN, sagen.
Diese drei Bedingungen und Ihre zugehörigen Filialen (oder überspringt, ist ein weiterer Weg, es zu tun) sind notwendig für jedes Programm. Nicht nur das, sondern einfach diese drei einfachen Operationen plus-Daten-verschieben von Anweisungen, sind ausreichend zu tun alles in einem Programm außer I/O, Wenn Sie wollten, und angesichts einer kooperierenden Speicher-Organisation umschreiben könnte Linux mit nur LOAD, STORE, ADD, SUB, und die drei bedingten Verzweigungen.
Den PDP-8 wurde eine viel leistungsfähigere Maschine als das: es hatte eine umfangreichen Satz von acht Anweisungen, einschließlich I/O.
HTH
Überraschend, es gibt so etwas wie eine ein instruction set computer.
Den wenigsten Befehlssatz erfordert keine Instruktion oder vielleicht null-Anweisung. Ich weiß nicht, ob Sie gekommen war, in Reale Geräte oder nicht, aber die one instruction set computer (OISC) umgesetzt wurde und erfolgreich in Kohlenstoff-Nanoröhren-Computer und MAXQ.
In der Tat x86 kann auch verwendet werden, als OISC-Architektur, da ist es möglich, alles mit nur einem einzigen
mov
, weil es wurde erwies sich als Turing-vollständig. Es gibt sogar einen compiler namens movfuscator zu kompilieren, die gültigen C-code in ein Programm mit nur MOVs (oder nur entweder XOR, SUB, ADD, XADD, ADC, SBB, UND/ODER, PUSH/POP, 1-bit-Schichten, oder CMPXCHG/XCHG)Aber IMO eine Architektur sollte "schnell" genug (oder nicht allzu viele Anweisungen wie OISC für eine Aufgabe im Vergleich zu anderen Architekturen) , um die als nützlich angesehen werden.
Den meisten basic-Anweisung Arten für einen computer sind Daten, Bewegungen, Logik - /Arithmetik-Operationen und Verzweigungen. Für arithmetische Operationen, nur eine
add/subtract
ist genug. Für die Logik ist, können wir berechnen, alle Funktionen mit nur einemNOR
oderNAND
, so dass nur eine benötigt wird. Für das springen ist, müssen wir einejump on "<="
oderjump on "<"
Unterricht. Daten Bewegungen können nachgebildet werden, die von add/sub. Wie können wir die Verwendung von 2-bits zum codieren von 3 opcodes (add
,nand
,jump on "<="
) und lassen Sie eine für die künftige expansion. Da aber dieser hat keine separate load/store-Anweisungen, muss Sie arbeiten direkt mit großen register Datei, anstatt den Speicher, oder der Anweisungen muss die Möglichkeit haben, Speicher verwenden als Operanden.Wenn mehr Geschwindigkeit benötigt wird, dann etwas mehr Logik, Verzweigung Anweisungen und eventuell laden/speichern Hinzugefügt werden können, die Erhöhung der opcode-Platz 3 bits. Der Befehlssatz kann:
Linke shift-Taste kann man mit
add
aber rechts ist es schwieriger, so können Sie auch wollen, fügen Sie eine shift-rechts zu erleichtern einige Allgemeine OperationenKönnen Sie überleben, sehr gut, mit einer minimalen Befehlssatz, bestehend nur aus
SOB:
subtract and branch. Ganze Programme können und wurden mit dieser.Blick auf kommerzielle Implementierungen
Die beste Antwort ist wahrscheinlich Blick auf bestehende kommerzielle Implementierungen.
Etwas, das nicht kommerziell verkauft werden, ist wahrscheinlich nicht sinnvoll.
Was ist die definition einer Anweisung?
Ich zum Beispiel könnte eine Anweisung implementiert, dass der unzip-Algorithmus, basierend auf einer hardware-Implementierung von unzip, und dies wäre natürlich die effizienteste Maschine möglich entpacken.
Wäre es wirtschaftlich attraktiv dennoch? Unwahrscheinlich, da die hardware wäre wohl zu spezialisiert, um zu rechtfertigen, die Kosten in der Entwicklungsphase.
Aber es gibt viel differenziertere Fällen als diesem extrem, und die Antwort wird wahrscheinlich variieren mit bestehenden Mitbewerber, Technologien und Nachfrage in der Zeit, um die Dinge noch schlimmer machen.
Am Ende, "effiziente hardware" bedeutet:
Mögliche Gründe, warum sehr kleine Turing ISA kann ineffizient sein
Bemerkenswerte OISC Implementierungen
Wäre es interessant zu analysieren, die eine konkretere Antwort.
movfuscator
https://github.com/xoreaxeaxeax/movfuscator
Spielzeug C-compiler für x86, die verwendet nur die
mov
x86-Anweisungen, die in einer sehr konkreten Art und Weise, dass eine einzige Anweisung reicht aus.Die Turing-Vollständigkeit zu haben scheint erwiesen, in einem Papier: https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf
subleq
Bildungs-OSIC, die zuvor erwähnt https://stackoverflow.com/a/9439153/895245 aber ohne den Namen:
Siehe auch:
https://esolangs.org/wiki/Subleq
Siehe auch
https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501
Möglicherweise möchten Sie auch zu schauen Turing-Vollständigkeit.
http://en.wikipedia.org/wiki/Turing_completeness
http://c2.com/cgi/wiki?TuringComplete
Was ist Turing-Vollständig?
Es bedeutet, dass eine Sprache genügt, um zu berechnen, alles, was berechnet werden kann.
Theoretisch ein single instruction computer ist möglich. Aber auf echter hardware, müssen Sie ein minimum von 4. Angenommen, ein Speicher-Architektur nur (keine Benutzer zugänglichen Registern).
MOV mem1 mem1 - kopieren Sie den Inhalt der Speicher mem1, um Speicher mem2 verlassen mem1 unverändert
NAND-mem1 mem2 zu mem3 - führe ein Bitweises logisches NAND zwischen den Daten auf mem1 und mem2 und schreiben das Ergebnis in mem3
BITSHIFTR mem1 mem2 mem3 - bitshift rechts die Daten auf mem1 mem2 Orte und schreiben die Ausgabe in mem3
JMPcond mem1 mem2 - test der least significant bit in mem1 und wenn es ist wahr(1) Sprung zu mem2
Jetzt nicht super schnell ein und es wird Essen Speicher-Bandbreite wie verrückt, aber es kann verwendet werden, implementieren Sie eine virtuelle Maschine mit jedem beliebigen Befehlssatz. Zusätzlich gibt es bestimmte Programmierung Zwängen, wie der Notwendigkeit, das Programm in alle Daten ab, oder die zumindest eine Speicherstelle mit nur das LSB auf 1 gesetzt. hardware-Peripheriegeräte verwenden, DMA, I/O-Zugriff, und wenn die Umsetzung auf einer harvard-Architektur das Programm keinen direkten Zugriff auf Dinge wie Zeiger.