In meiner Kindheit programmierte ich auf einem MK-61 Sowjetrechner . Es hatte vier Betriebsregister (X, Y, Z, T) und 15 Speicherregister. Ein Programm könnte 105 Schritte haben.
Soweit ich mich erinnere, hatte es Befehle wie:
- Tauschen Sie die X- und Y-Register
- Schieberegister (Z nach T, Y nach Z, X nach Y)
- Vom Speicherregister (1..15) nach X kopieren
- Kopieren von X nach Speicherregister (1..15)
- Wenn X <0, dann gehe zum Programmschritt ##
- Führen Sie die Operation (+, -, *, /) mit den X- und Y-Werten aus und setzen Sie das Ergebnis auf X
Ist dieser Befehl als Assemblersprache definiert? Hatte ich mit diesem Gerät eine grundlegende Vorstellung von Assemblersprachen?
Es stellt sich heraus, dass es sich um eine sogenannte "Tastenanschlag-Programmierung" handelt .
Komische Tatsache: Ein ähnlicher Taschenrechner (wie dieser, jedoch mit energieabhängigem Speicher) wurde 1988 als Backup-Hardware für die Flugbahnberechnung von Weltraummissionen verwendet. :-)
programming-languages
assembly
defhlt
quelle
quelle
Antworten:
Dies ist keine Assemblersprache, dies ist eine Maschinensprache.
Maschinensprache ist alles, was der Maschine physisch etwas bedeutet. Bei Taschencomputern sind es Tastendrücke, die in der Maschine in Zahlen codiert sind. Sie geben keine weiteren Informationen zu dieser Electronika MK61-Maschine an , daher möchte ich das Beispiel der TI-57 anführen : In der Maschinensprache wurde die Nummer des Schlüssels verwendet, der als Spalte in den Zehnern und Zeilen in den Einheiten angegeben ist. So wäre zum Beispiel ein Programm, das den Speicher 8 inkrementieren würde:
Dies ist die Maschinensprache: Sie wird direkt von der Maschine interpretiert.
Assemblersprache wäre der vom Menschen lesbare Text:
Um diesen Text in die Folge von Maschinencodes umzuwandeln, benötigen Sie einen Assembler , der ein Programm sein kann, oder einen Menschen, der diesen Text in die Folge von Zahlen übersetzt.
Die Verwirrung wird oft gemacht, weil es oft eine recht direkte Übersetzung von der Assemblersprache in die Maschinensprache gibt, aber dies ist nicht immer eine ganz direkte Übersetzung: Makro-Assembler verfügen über leistungsfähige Makros, die im Assembler viel Arbeit machen und eine viele maschinensprachliche Anweisungen aus einer einzigen Montageanleitung. Die bloße Übersetzung symbolischer Adressen kann eine Änderung des Operationscodes der Verzweigungsbefehle beinhalten (z. B. beim Wechsel von kurzer relativer Adressierung zu langer relativer oder absoluter Adressierung), sodass dies nicht immer so direkt ist, wie Sie denken.
quelle
Ich würde sagen, dass die Antwort auf beide Teile Ihrer Frage Nein lautet: Die Befehle dieses Rechners sind nicht mit der Assemblersprache vergleichbar, und die Programmierung dieses Rechners unterscheidet sich von der Programmierung in Assemblersprache.
Die "Sprache", in der dieser Taschenrechner programmiert ist, ist relativ niedrig, stellt jedoch immer noch eine Abstraktion über Konstrukte auf niedrigerer Ebene dar, die für Sie als Programmierer nicht sichtbar sind. Ich vermute ein bisschen, aber Ihrer Beschreibung und dem Blick auf die Tastatur (und dem Vergleich mit ähnlich aussehenden Taschenrechnern von Hewlett Packard oder Texas Instruments aus den späten 1970er und frühen 1980er Jahren) nach würde ich sagen, dass jedes Programm "Schritt" ist "könnte nicht nur eine einfache Operation wie" addieren "oder" X & Y tauschen "sein, sondern auch komplexere Operationen wie Trigonometrie, Exponentiation, Logarithmen usw. Jeder dieser Schritte wird wahrscheinlich als interne mikrocodierte Routine implementiert. Dieser Mikrocode ist wahrscheinlich in Assemblersprache programmiert, aber ich glaube nicht. '
Wie bereits von anderen beschrieben, entspricht die Assemblersprache in der Regel sehr genau (wenn nicht 1: 1) den Funktionen des zugrunde liegenden Computers. Ich würde sagen, dass die Assembler-Programmierung die folgenden Merkmale enthält, die bei der Programmierung dieses Rechners wahrscheinlich nicht vorhanden sind.
Operationen umfassen Operationen auf niedrigerer Ebene wie bitweises UND, ODER, XOR, Verschieben; Ganzzahl- und (möglicherweise) Gleitkomma-Arithmetik für eine Vielzahl von Datengrößen (z. B. einfache oder doppelte Genauigkeit); Laden / Speichern einer Vielzahl von Größen (Byte, Halbwort, Wort usw.).
Übergeordnete Operationen (Trigger, Logarithmen) sind normalerweise Unterprogrammaufrufe, keine Anweisungen. Es gibt einige Ausnahmen, wie zum Beispiel den DEC VAX, der eine Anweisung zur Polynomauswertung hatte. [Edit: OP wies darauf hin, dass x87 auch Triggerfunktionen hat.]
Das Adressierungsschema der Maschine wird angezeigt. Wenn der Adressraum segmentiert ist, müssen Sie eine Basisadresse in ein Register laden und dann den Adresscode oder die Daten in Bezug auf dieses Register. Auch bei einem flachen Adressraum sind Ihnen Adressen und Adressarithmetik bekannt. In der Regel erlauben Assembler Programmierern die Verwendung von Bezeichnungen zur Kennzeichnung von Adressen. Befindet sich eine Adresse jedoch in einem anderen Segment, müssen Sie möglicherweise ein Segmentregister laden, bevor Sie darauf zugreifen können.
Die Speicherausrichtung wird angezeigt. Beispielsweise kann auf vielen Maschinen ein 4-Byte-Wort nur von Adressen geladen oder in Adressen gespeichert werden, die ein Vielfaches von 4 Byte sind.
Datendarstellung ist ausgesetzt. In der Regel bieten Assembler eine Möglichkeit, numerische Daten in Hexadezimal-, Oktal-, Dezimal-, Gleitkomma- und gelegentlich in Zeichendaten anzugeben.
Die Spezialisierung der Register ist aufgedeckt. Einige Architekturen erlauben Ganzzahl- und Adressoperationen in einigen Registern, aber nur Gleitkommaoperationen in anderen oder Adressoperationen nur in Bezug auf bestimmte Register. Manchmal gibt es spezialisierte Register, wie z. B. solche mit Bedingungs- oder Statusbits, die nicht zur Adressierung oder Arithmetik verwendet werden können.
Unterprogrammaufrufkonventionen werden angezeigt. Argumente und Rückgabewerte können in Registern übergeben oder auf einen Stapel verschoben und von diesem abgerufen werden. (Dieser Stapel ist normalerweise ein Speicherbereich, der von einem speziellen Stapelzeigerregister adressiert wird, nicht eine feste Menge wie XYZ und T.)
Möglicherweise müssen Sie sich bewusst sein, wie Sie mit dem Betriebssystem interagieren, oder, falls es keines gibt, wie Sie mit Hardware-Einrichtungen auf niedriger Ebene umgehen. Unter einem Betriebssystem müssen Sie Argumente in Register (oder den Stack) laden und in den Kernel einfangen. Ohne Betriebssystem müssen Sie sich wahrscheinlich mit Interrupts und Timern auseinandersetzen.
Ich erinnere mich an die Assembler-Programmierung, dass sie sehr, sehr schmerzhaft ist. Ich denke, dass die Programmierung dieses Rechners im Vergleich einfach ist und Spaß macht. (Es tut uns leid.)
quelle
∧
,∨
,⊕
undИНВ
(was bedeutet , INV) auf der Tastatur. 2) Ich dachte, dass Sinus, Cosinus usw. Anweisungen gemäß dieser Referenzreferenz ( x86asm.net/coder32.html) für x86-Prozessoren sind. Aber natürlich stimme ich Ihnen zu, dass der Assembler viel komplizierter ist.Ja, das klingt für mich definitiv nach einer Assemblersprache.
Es ist schwer zu sagen, ob dies tatsächlich eine Baugruppe ist oder nicht, nur aus der Beschreibung, da die Definition - eine Sprache, deren Befehle 1: 1 mit dem Maschinencode der Zielplattform verknüpft sind - schwer zu bestimmen ist, ohne den Maschinencode selbst zu kennen. Das klingt jedoch so, wie ASM auf anderen Plattformen funktioniert.
quelle
Es hat sicherlich einige Ähnlichkeiten mit einer Assemblersprache, aber ich werde argumentieren, dass es nicht so ist, wie es wirklich ist.
In einer Assemblersprache ordnen die Vorgänge den CPU-Anweisungen meistens 1: 1 zu. Es gibt einige Ausnahmen, wie zum Beispiel Makros und Pseudo-Ops (wie zum Beispiel eine CLEAR-Anweisung, die ein Register wirklich mit sich selbst XOR-verknüpft); Der eigentliche Punkt ist, dass ein Assemblerprogramm die zu generierenden CPU-Anweisungen genau bestimmt. (Das ist der grundlegende Unterschied zwischen einer Assemblersprache und einer höheren Sprache wie C; in letzterer spezifizieren Programme das Verhalten ).
Der Rechner hat zweifellos eine CPU, aber ich bezweifle, dass sich einzelne CPU-Anweisungen auf die "Register" X, Y, Z und T beziehen oder Operationen auf hoher Ebene wie
x
y
odersin
(oderПРГ
was auch immer das bedeutet!) Ausführen .Stattdessen bin ich sicher, dass viele oder die meisten der sichtbaren Operationen als Unterprogrammaufrufe ausgeführt werden. Und für jede ausgeführte Operation muss eine erhebliche Menge zusätzlicher Arbeit aufgewendet werden, um das Ergebnis anzuzeigen.
Sie können sich die sichtbaren Vorgänge als Assemblersprache für eine übergeordnete virtuelle Maschine vorstellen, diese virtuelle Maschine wird jedoch über einen Interpreter implementiert, der auf der realen CPU ausgeführt wird.
Dennoch würde ich sagen, dass die Antwort auf den zweiten Teil Ihrer Frage:
ist ja.
quelle
BMI
Beispiel nicht direkt unterstützt ,IF ... THEN ...
werden im Allgemeinen zwei Anweisungen gelesen: zuerst ein Vergleich (x < 0
in diesem Fall), dann eine Aktion, die auf dem Ergebnis dieses Vergleichs basiert (höchstwahrscheinlich ein Sprung bei der Arbeit) in Assemblersprache). In Intel 8086 so etwas wie (vorausgesetzt, esx
ist in AX)CMP AX, 0
JNL After_IfThen_Block
. (JNL ist Jump if not less; in einer höheren Sprache würde dies so etwas wieif not (x < 0) then goto After_IfThen_Block
das Gleiche wie lautenif (x >= 0) then {code until there}
.)ПРГ
(PRG - Programmierung) ist nur eine Metataste, um in den Programmiermodus zu wechseln, nicht irgendeine Funktion.Das ist richtig, das Fragment des bereitgestellten Codes sieht aus wie Assemblersprache . Die korrekte Konvertierung dieses Codes würde die Version definieren.
Bearbeiten: Es gibt eine bestimmte Sprache für dieses Gerät, aber es handelt sich nicht um eine Assembly.
Es sieht auch aus wie ein von der UdSSR hergestellter Taschenrechner. Läuft es mit gerundeten Batterien / Kabeln?
quelle
Ich würde behaupten, Sie nähern sich einem BASIC-Assembler-Hybrid, aber das hängt wirklich von der zugrunde liegenden CPU und Architektur ab. Es muss keinen direkten Speicherzugriff geben, wenn Sie keinen echten Arbeitsspeicher haben. Gleitkommaoperationen müssen auch ohne FPU nicht vorhanden sein.
Ich denke, ein einfacher Test wäre eine Additionsoperation für eine Gleitkommazahl und eine ganze Zahl. Die meisten höheren Programmiersprachen akzeptieren ADD 2.5, 7 und geben 9.5 zurück. Assemblersprachen würden jedoch die Ausgabe basierend auf der aufgerufenen Anweisung und abhängig von der zugrunde liegenden Zahlendarstellung in Binär unterscheiden. Für die meisten Assemblersprachen ist eine andere Anweisung erforderlich, die auf der Verwendung von Gleitkomma- und Ganzzahloperationen basiert. Eine Ausnahme könnte eine Art Festkommaformat sein.
quelle
Reverse Polish Notation (RPN) Taschenrechner waren klassisch. Nein, obwohl die Registerbezeichnungen wie Assemblersprache wirken, war es dies nicht. Berechnungen wurden durchgeführt, indem vom algebraischen Format auf den Stapel übersetzt wurde. Die verwendeten Zahlen wurden in den Stapel geschoben, und Vorgänge wurden für die zuletzt gestapelten Werte gegen die vorletzten gestapelten Werte ausgeführt.
Sie können den Stapel "drehen", um die Werte zu verschieben, da der angezeigte Wert ein Stapelelement war. Die Ergebnisse können nach Bedarf ausgetauscht oder gestapelt werden, um eine nahezu komplexe Berechnung durchzuführen. Wenn Sie Stapelhardware und Assemblersprache verstehen, war dieser Taschenrechner trivial zu lernen, da sein Paradigma am ähnlichsten war.
quelle