it-swarm.com.de

Ist das eine Assemblersprache?

In meiner Kindheit habe ich auf einem MK-61sowjetischen Taschenrechner programmiert. Es hatte vier Betriebsregister (X, Y, Z, T) und 15 Speicherregister. Ein Programm kann 105 Schritte haben.

Soweit ich mich erinnere, hatte es Befehle wie:

  • Tauschen Sie die X- und Y-Register aus
  • Schieberegister (Z nach T, Y nach Z, X nach Y)
  • Kopie aus dem Speicherregister (1..15) nach X.
  • Kopie von X in das Speicherregister (1..15)
  • Wenn X <0, fahren Sie mit Programmierschritt ## fort
  • Führen Sie die Operation (+, -, *, /) mit X- und Y-Werten aus und setzen Sie das Ergebnis auf X.

Ist dieser Befehl eine Assemblersprache? Hatte ich mit diesem Gerät eine grundlegende Vorstellung von Assemblersprachen?

Device

Es stellt sich heraus, dass es sich um etwas handelt, das "Tastenanschlagprogrammierung" heißt.

Lustige Tatsache: Ein ähnlicher Taschenrechner (wie dieser, aber mit energieunabhängigem Speicher) wurde 1988 als Backup-Hardware für Flugbahnberechnungen für Weltraummissionen verwendet ::-)

70
defhlt

Dies ist keine Assemblersprache, sondern eine Maschinensprache.

Maschinensprache ist alles, was der Maschine physisch etwas bedeutet. Bei Taschencomputern handelt es sich um Tastendrücke, die in Zahlen in der Maschine codiert sind. Sie geben keine weiteren Informationen zu dieser Electronika MK61-Maschine , daher gebe ich das Beispiel der TI-57 : Die Maschinensprache verwendete die Nummer des angegebenen Schlüssels als Spalte in den Zehner und Linie in den Einheiten. Ein Programm, das den Speicher 8 erhöhen würde, wäre beispielsweise:

33 8  57 1 58 23

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

Assemblersprache wäre der von 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 übersetzt die Folge von Zahlen.

Die Verwirrung wird oft gemacht, weil es oft eine ziemlich direkte Übersetzung von der Assemblersprache in die Maschinensprache gibt, aber dies ist nicht immer eine ganz direkte Übersetzung: Makro-Assembler haben leistungsstarke Makros, die viel Arbeit im Assembler erledigen und eine generieren können viele maschinensprachliche Anweisungen aus einer einzigen Montageanweisung. Die bloße Übersetzung symbolischer Adressen kann das Ändern des Operationscodes der Verzweigungsbefehle beinhalten (z. B. beim Wechsel von einer kurzen relativen Adressierung zu einer langen relativen oder absoluten Adressierung), sodass dies nicht immer so direkt ist, wie Sie denken.

13

Ich würde sagen, dass die Antwort auf beide Teile Ihrer Frage Nein lautet: Die Befehle dieses Rechners ähneln nicht der Assemblersprache, und die Programmierung dieses Rechners unterscheidet sich von der Programmierung in Assemblersprache.

Die "Sprache", in der dieser Rechner programmiert ist, ist ziemlich niedrig, stellt jedoch eine Abstraktion über Konstrukte niedrigerer Ebene dar, die für Sie als Programmierer nicht sichtbar sind. Ich vermute ein bisschen, aber anhand Ihrer Beschreibung und des Blicks auf die Tastatur (und des Vergleichs mit ähnlich aussehenden Taschenrechnern von Hewlett Packard oder Texas Instruments aus den späten 1970er und frühen 1980er Jahren) würde ich sagen, dass jedes Programm "Schritt" ist "könnte nicht nur eine einfache Operation wie" Hinzufügen "oder" Tauschen von X & Y "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, dass er für die normale Taschenrechnerprogrammierung auf der von Ihnen beschriebenen Ebene sichtbar ist.

Wie andere beschrieben haben, entspricht die Assemblersprache normalerweise sehr genau (wenn nicht 1: 1) den Einrichtungen der zugrunde liegenden Maschine. Ich würde sagen, dass die Assembler-Programmierung die folgenden Eigenschaften 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, Word 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. [Bearbeiten: 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 relativ zu diesem Register. Selbst bei einem flachen Adressraum sind Ihnen Adressen und Adressarithmetik bekannt. Normalerweise ermöglichen Assembler Programmierern, Beschriftungen zur Bezeichnung von Adressen zu verwenden. Wenn sich eine Adresse jedoch in einem anderen Segment befindet, müssen Sie möglicherweise ein Segmentregister laden, bevor Sie darauf zugreifen können.

  • Die Speicherausrichtung wird freigelegt. Beispielsweise kann auf vielen Computern ein 4-Byte-Wort nur von Adressen geladen oder in Adressen gespeichert werden, die ein Vielfaches von 4 Byte sind.

  • Die Datendarstellung wird angezeigt. Normalerweise bieten Assembler eine Möglichkeit, numerische Daten in Hex-, Oktal-, Dezimal-, Gleitkomma- und gelegentlich Zeichendaten anzugeben.

  • Die Spezialisierung von Registern ist aufgedeckt. Einige Architekturen erlauben Ganzzahl- und Adressoperationen in einigen Registern, aber Gleitkommaoperationen nur in anderen oder erlauben die Adressierung nur relativ zu bestimmten Registern. Manchmal gibt es spezielle Register, beispielsweise solche mit Bedingungs- oder Statusbits, die nicht zur Adressierung oder Arithmetik verwendet werden können.

  • Konventionen zum Aufrufen von Unterprogrammen werden angezeigt. Argumente und Rückgabewerte können in Registern übergeben oder auf einen Stapel verschoben und von diesem entfernt werden. (Dieser Stapel ist normalerweise ein Speicherbereich, der von einem speziellen Stapelzeigerregister adressiert wird, kein fester Satz wie X Y Z und T.)

  • Möglicherweise müssen Sie sich darüber im Klaren sein, wie Sie mit dem Betriebssystem interagieren oder, wenn es keines gibt, mit Hardwareeinrichtungen auf niedriger Ebene umgehen. Bei einem Betriebssystem müssen Sie Argumente in Register (oder den Stapel) laden und in den Kernel einfangen. Ohne Betriebssystem müssen Sie wahrscheinlich mit Interrupts und Timern umgehen.

Ich erinnere mich an die Programmierung der Versammlung, dass sie sehr, sehr schmerzhaft ist. Ich denke, dass das Programmieren dieses Rechners im Vergleich einfach und unterhaltsam ist. (Es tut uns leid.)

36
Stuart Marks

Ja, das klingt für mich definitiv nach einer Assemblersprache.

Es ist schwer zu sagen, ob das tatsächlich is Assembly ist, nur aus der Beschreibung, da die Definition - eine Sprache, deren Befehle 1: 1 mit dem Maschinencode der Zielplattform abbilden - ohne a schwer zu bestimmen ist Kenntnis des Maschinencodes selbst, aber das klingt nach der Funktionsweise von ASM auf anderen Plattformen.

25
Mason Wheeler

Es hat sicherlich einige enge Ähnlichkeiten mit einer Versammlungssprache, aber ich werde argumentieren, dass das nicht das ist, was es wirklich ist.

In einer Assemblersprache ordnen die Operationen den CPU-Anweisungen meist 1: 1 zu. Es gibt einige Ausnahmen, wie 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 Assembly-Programm die zu generierenden CPU-Anweisungen genau bestimmt. (Das ist der grundlegende Unterschied zwischen einer Assemblersprache und einer höheren Sprache wie C; in letzterer geben Programme Verhalten an).

Der Rechner enthält zweifellos eine CPU, aber ich bezweifle, dass sich einzelne CPU-Anweisungen auf die X-, Y-, Z- und T- "Register" beziehen oder Operationen auf hoher Ebene wie x ausführeny oder sin (oder ПРГ, Was auch immer das heißt!).

Stattdessen bin ich sicher, dass viele oder die meisten sichtbaren Operationen als Unterprogrammaufrufe ausgeführt werden. Und für jede ausgeführte Operation muss eine erhebliche Menge zusätzlicher Arbeit geleistet werden, um das Ergebnis anzuzeigen.

Sie können sich die sichtbaren Vorgänge als Assemblersprache für eine virtuelle Maschine auf hoher Ebene vorstellen, aber diese virtuelle Maschine wird über einen Interpreter implementiert, der auf der realen CPU ausgeführt wird.

Trotzdem würde ich sagen, dass die Antwort auf den zweiten Teil Ihrer Frage:

Hatte ich eine grundlegende Vorstellung von Assemblersprachen mit diesem Gerät?

ist ja.

11
Keith Thompson

Das ist richtig, das gepostete Codefragment sieht aus wie Assembly Sprache. Die ordnungsgemäße Konvertierung dieses Codes würde die Version definieren.

Edit : Es hat eine bestimmte Sprache für dieses Gerät, aber es ist keine Assembly.

Es sieht auch aus wie ein von der UdSSR hergestellter Taschenrechner. Läuft es mit abgerundeten Batterien/Kabeln?

9
Yusubov

Reverse Polish Notation (RPN) Taschenrechner waren klassisch. Nein, obwohl die Registerbezeichnungen wie Assemblersprache erscheinen, war dies nicht der Fall. Die Berechnungen wurden durchgeführt, indem vom algebraischen Format auf den Stapel übersetzt wurde. Die verwendeten Zahlen wurden in den Stapel geschoben und Operationen wurden am letzten Stapel gegen vorletzte gestapelte 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 die Stapelhardware und die Assemblersprache verstehen, war dieser Taschenrechner trivial zu lernen, da sein Paradigma am ähnlichsten war.

3
Chip

Ich würde behaupten, dass Sie einem BASIC Assembly-Sprachhybrid näher sind, aber es hängt wirklich von der zugrunde liegenden CPU und Architektur ab. Es muss kein direkter Speicherzugriff vorhanden sein, wenn Sie nicht über true RAM) verfügen. Gleitkommaoperationen müssen auch ohne FPU nicht vorhanden sein.

Ich denke, ein einfacher Test wäre eine Additionsoperation für eine Gleitkommazahl und eine Ganzzahl. 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ärform unterscheiden. Für die meisten Assemblersprachen muss eine andere Anweisung verwendet werden, die auf der Verwendung von Gleitkomma- und Ganzzahloperationen basiert. Eine Ausnahme hiervon könnte eine Art Festkommaformat sein.

3
Peter Smith