Ist das eine Assemblersprache?

70

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?

Gerät

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. :-)

defhlt
quelle
Nett! - Dieses Bild weckt Erinnerungen. Ich habe meine MK-52 noch irgendwo im Keller :)
DXM
Dies sieht aus wie ein sowjetischer Klon des HP 65. Er kann in umgekehrter polnischer Notation mit Operationen programmiert werden, die auf einem Stapel drücken und ziehen. Die RPN-Operatoren werden einfach im Speicher aufgezeichnet und von einer CPU interpretiert, die wahrscheinlich einer 4004-CPU entspricht. Der Code im 4004-ROM wurde wahrscheinlich vom 4004-Assembler kompiliert, aber die Tastenanschläge ähneln eher Tabellenkalkulationsmakros.
Meredith Poor

Antworten:

13

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:

33 8  57 1 58 23

Dies ist die Maschinensprache: Sie wird direkt von der Maschine interpretiert.

Assemblersprache wäre der vom Menschen lesbare Text:

RCL 8 
+
1
=
STO 8

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.

Pascal Bourguignon
quelle
36

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.)

Stuart Marks
quelle
1
1) Nun, es hat einige bitweise Operation AND, OR, XOR, NOT - blaue Symbole , , 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.
13.
Wenn Sie die Referenz für diese Operation des VMS-Befehlssatzes wünschen - deathrow.vistech.net/… . Einige andere lustige Teile
25

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.

Mason Wheeler
quelle
11

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 xyoder sin(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:

Habe ich eine Grundidee für Assemblersprachen mit diesem Gerät?

ist ja.

Keith Thompson
quelle
1
Unsere Boxen haben auch keine AX, BX, CX & DX - Assemblersprachen sind als symbolische Übersetzung zugelassen. Ich bin damit einverstanden, dass die Funktionen auf hoher Ebene mit Sicherheit keine Assemblierung sind, beachte jedoch, dass die von ihm aufgelisteten Funktionen sie nicht enthalten. Ich halte es zwar für unwahrscheinlich, dass es sich wirklich um eine Assemblersprache handelt (alles muss eine feste Länge haben, damit der Adressierungsmodus funktioniert), aber keiner der aufgelisteten Befehle geht über den Assembler auf einem PC hinaus.
Loren Pechtel
2
"Wenn X <0, dann gehe zum Programmschritt ##" ist eine einfache BMI-Montageanweisung (Verzweigung wenn minus).
Mouviciel
1
@mouviciel Und selbst wenn die Plattform so etwas wie das BMIBeispiel nicht direkt unterstützt , IF ... THEN ...werden im Allgemeinen zwei Anweisungen gelesen: zuerst ein Vergleich ( x < 0in 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, es xist 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 wie if not (x < 0) then goto After_IfThen_Blockdas Gleiche wie lauten if (x >= 0) then {code until there}.)
CVn
1
ПРГ(PRG - Programmierung) ist nur eine Metataste, um in den Programmiermodus zu wechseln, nicht irgendeine Funktion.
Oleg V. Volkov
1
@mouviciel: Ich bin skeptisch, dass "wenn X <0, dann gehe zu Programmschritt ##" tatsächlich als einzelne Hardware-CPU-Anweisung implementiert ist . Ich spekuliere, dass ein auf dem Rechner eingegebenes Programm nicht als Folge von CPU-Anweisungen gespeichert wird. Vielmehr wird es als Folge von Anweisungen höherer Ebene gespeichert, die von einem Firmware-Programm interpretiert werden. Ich habe noch nie mit diesem speziellen Rechner gearbeitet, aber ich habe den HP-48 verwendet. der Benutzer sichtbaren Befehlssatz ist sehr verschieden von der des Saturn CPU , die es verwendet.
Keith Thompson
9

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?

EL Yusubov
quelle
3
Richtig, es wurde in der sowjetischen Ukraine ab Mitte der 80er Jahre produziert. Ich habe eine im Jahr 1991 gemacht. Es hat beide Steckplätze für 3 AA-Batterien und für 220V-Adapter.
12.
1
Das ist wirklich ein Nostalgie für mich. Ich erinnere mich an diesen Markennamen "Elektronika" :)
EL Yusubov
3

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.

Peter Smith
quelle
Es könnte einfach alle Zahlen als Gleitkommazahlen behandeln und eines der Argumente 7.0 berücksichtigen.
Oleg V. Volkov
@ OlegV.Volkov vielleicht, aber dann brauchst du nur zwei Gleitkommazahlen zu wählen, deren Summe keine wahre Darstellung hat. Sie könnten auch nach Stornofehlern bei der Subtraktion suchen.
Peter Smith
3

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.

Chip
quelle