Wir schreiben hauptsächlich Programme in Hochsprache. Während des Studiums bin ich auf Assemblersprache gestoßen. Ein Assembler konvertiert also Assemblersprache in Maschinensprache und ein Compiler macht dasselbe mit Hochsprache. Ich habe festgestellt, dass Assembler Anweisungen wie Move R1 R3, Move A 5 usw. enthält. Und es ist ziemlich schwer zu lernen. Warum wurde Assemblersprache erstellt oder war es diejenige, die zuerst vor der Hochsprache erschien? Warum lerne ich in meinem Computerkurs über Monteure?
programming-languages
education
history
Nithin Jose
quelle
quelle
Antworten:
"Warum wurde die Assemblersprache erstellt?"
Die Assemblersprache wurde als genaue Abkürzung für die Codierung auf Maschinenebene erstellt, damit Sie nicht den ganzen Tag mit 0 und 1 zählen müssen. Es funktioniert genauso wie Code auf Maschinenebene: mit Anweisungen und Operanden.
"Welches kam zuerst?"
Wikipedia hat einen guten Artikel über die Geschichte der Programmiersprachen
"Warum lerne ich in meinem Computerkurs über Monteure?"
quelle
Nun, es gibt tatsächlich nur eine Sprache, die wir jemals brauchen werden , nämlich "Maschinensprache" oder "Maschinencode". Es sieht aus wie das:
Dies ist die einzige Sprache, die Ihr Computer direkt sprechen kann. Dies ist die Sprache, die eine CPU spricht (und technisch sprechen verschiedene CPU-Typen verschiedene Versionen). Es ist auch scheiße anzuschauen und zu versuchen zu verstehen.
Glücklicherweise entspricht jeder Binärabschnitt einer bestimmten Bedeutung. Es ist in mehrere Abschnitte unterteilt:
Diese Werte entsprechen:
Diese Operation würde also die Zahlen in den Registern 1 und 2 addieren und diesen Wert in Register 3 eintragen. Wenn Sie diese Werte buchstäblich in eine CPU eintragen und "go" sagen, werden Ihnen zwei Zahlen hinzugefügt. Die Operation "subtrahieren" könnte eine 0011 oder so sein, anstelle von 0010 hier. Welchen Wert auch immer hat, die CPU führt eine Subtraktion durch.
Ein Programm könnte also so aussehen (versuchen Sie nicht, es zu verstehen, da ich diese spezielle Version des Maschinencodes erfunden habe, um die Dinge zu erklären):
Ist das scheiße zum lesen? Bestimmt. Aber wir brauchen es für die CPU . Nun, wenn jeder Maschinencode einer bestimmten Aktion entspricht, lassen Sie uns einfach eine einfache "englische" Abkürzung machen. Wenn wir dann verstehen, was das Programm tut, konvertieren Sie ihn in echten binären Maschinencode und geben ihn der CPU zum Ausführen.
Unsere ursprüngliche Anweisung von oben könnte also so aussehen:
Beachten Sie, dass diese englische Version eine genaue Zuordnung zum Maschinencode aufweist . Wenn wir also eine Zeile dieses "Englischen" schreiben, schreiben wir wirklich nur freundlicheren und verständlicheren Maschinencode.
Nun, das ist Assemblersprache. Das ist der Grund, warum es existiert und warum es ursprünglich geschaffen wurde.
Um zu verstehen, warum wir es jetzt brauchen, lesen Sie die obigen Antworten, aber der Schlüssel zum Verständnis ist der folgende: Hochstufige Sprachen haben keine einzige Darstellung: Maschinencode. ZB in C oder Python oder was auch immer:
Das klingt genau so, als würde unser Zusatz von oben vorausgesetzt, er
x
befindet sich in Register 1,y
in Register 2 undz
sollte in Register 3 enden. Aber was ist mit dieser Zeile?Versuchen Sie , diese Zeile in 16 binären Bits darzustellen und einer CPU "go" zu sagen. Das kannst du nicht. Der Maschinencode verfügt nicht über einen einzelnen Operationsbefehl zum Ausführen einer Addition, Subtraktion und was auch immer mit 4 oder 5 Variablen gleichzeitig. Es muss also zuerst in eine Sequenz von Maschinencode konvertiert werden . Dies tun Sie, wenn Sie eine Hochsprache "kompilieren" oder "interpretieren".
Nun, wir haben Programme, um das zu tun. Warum brauchen wir jetzt die Montage? Nehmen wir an, Ihr Programm läuft langsamer als erwartet und Sie möchten wissen, warum. Betrachtet man die Maschinensprache "Ausgabe" dieser Zeile, könnte dies so aussehen:
Nur um diese eine Python-Zeile fertig zu bekommen. Also wollen Sie das wirklich debuggen?!?!?! NO . Stattdessen bitten Sie Ihren Compiler, Ihnen die Ausgabe in der Form zur Verfügung zu stellen, die Sie tatsächlich leicht verstehen können. Dabei handelt es sich um die Assembler-Version, die genau diesem Maschinencode entspricht. Dann können Sie herausfinden, ob Ihr Compiler etwas Dummes tut, und versuchen, es zu beheben.
(Zusätzlicher Hinweis zu @ Raphaels Rat: Sie könnten tatsächlich CPUs konstruieren, die mit anderen Dingen als Binärcodes arbeiten, wie z. B. ternären (Basis 3) oder Dezimalcodes oder sogar ASCII. Aus praktischen Gründen haben wir uns jedoch wirklich an Binärcodes gehalten.)
quelle
Ja, Assembler war eine der ersten Programmiersprachen, die Text als Eingabe verwendeten, im Gegensatz zu Lötdrähten, die Steckkarten und / oder Kippschalter verwendeten. Jede Assemblersprache wurde nur für einen Prozessor oder eine Prozessorfamilie erstellt, da die Anweisungen direkt auf die vom Prozessor ausgeführten Opcodes abgebildet wurden .
Wenn Sie Gerätetreiber programmieren oder Compiler schreiben müssen, ist es von unschätzbarem Wert, zu verstehen, wie ein Prozessor funktioniert, wenn dies nicht erforderlich ist. Der beste Weg, dies zu verstehen, besteht darin, Code in Assembly zu schreiben.
Wenn Sie sich ansehen, wie ein Compiler Code schreibt, werden häufig Optionen zum Aufrufen von Konventionen angezeigt , die ohne Kenntnis der Assembly wahrscheinlich nicht verstanden werden können.
Wenn Sie einen Fehler beheben müssen und die einzige Eingabe, die Sie haben, ein Core-Dump ist , müssen Sie auf jeden Fall Assembler kennen, um die Ausgabe zu verstehen, die Assembler-Code ist, und wenn Sie das Glück haben, mit Anweisungen höherer Ebenen einer höheren Sprache erweitert zu werden.
quelle
Lassen Sie mich noch einen praktischen Aspekt hinzufügen. Dies ist (wahrscheinlich) kein historischer Grund, sondern ein Grund für Sie heute.
Assembly (im Vergleich zu Hochsprachen) ist nackt . Es verbirgt nichts (was in Software gemacht wird), und es ist einfach in dem Sinne, dass es einen relativ kleinen, festen Satz von Operationen hat.
Dies kann für eine genaue Analyse des Algorithmus hilfreich sein. Die Semantik und der Kontrollfluss sind so einfach, dass alle Operationen (oder die erwartete Anzahl) gezählt werden können, indem das Kontrollflussdiagramm mit Übergangszahlen (Wahrscheinlichkeiten) versehen wird. Knuth macht dies in seinen TAoCP-Büchern mit großer Wirkung und demonstriert einige der strengsten Algorithmusanalysen, die es gibt.
Anekdote: Mein Kollege hat genau zu diesem Zweck gelernt, Java Bytecode zu lesen.
quelle
Hier gibt es Antworten:
Wann brauchen wir Assemblersprache? auf Programmers.SE
Warum wird Assemblersprache immer noch benötigt, wenn wir über Hochsprachen verfügen, die ausgefeilte Tools anbieten? auf Stackoverflow
Warum Assemblersprache lernen? von Gary L. Burt
Alle diese Antworten deuten auf Folgendes hin:
quelle
Assembly = Maschinencode
Einige Leute machen sich ständig Gedanken darüber, wie sich die Assemblersprache von den numerischen Codes unterscheidet, die die CPU versteht.
Dies ist zwar wahr, geht aber völlig daneben.
In Bezug auf die Übersetzung sind Assemblersprache und numerische Zeichen (binär, hexadezimal, was auch immer) ein und dasselbe.
Grok it or drop it
Wenn Sie eine Baugruppe grok it , wissen Sie, wie ein tatsächlicher Computer funktioniert.
Grokking Montage beinhaltet:
multiscalar
bedeutetWenn Sie sich versammeln, haben Sie ein fast vollständiges Bild davon, wie die an Ihre Tastatur angeschlossene CPU funktioniert.
Sie müssen dieses Wissen nutzen, wie ein Gehirnchirurg sein Skalpell benutzt.
Benötigen Sie keine stinkenden Abstraktionen Solange Sie nicht die Baugruppe (und damit die CPU auf dem Operationstisch) zusammenbauen, werden Sie niemals frei von den Klauen der Abstraktionen der RAM-Maschine sein (oder Gott verbieten der Turing-Maschine den Horror ).
L33t Hax0r 5k1llz
Assembly hilft Ihnen auch zu verstehen, wie der 133thax0r es schafft, die Schutzmaßnahmen zu umgehen. (F: Warum funktioniert ASLR nicht ? Weil es
mov rax,fs:[28h]
kaputt geht ).Die 0,1%
Es kommt nicht auf das Wissen über die Montage an, sondern auf das Wissen über die Maschine, an der Sie arbeiten.
Wenn Sie die Maschine kennen lernen möchten, müssen Sie sie verstehen und das heißt, Sie müssen die Sprache der Maschine sprechen.
Wenn Sie dies nicht tun, stecken Sie in der Abstraktion fest.
Das ist Wissenschaft und das ist gut, aber das ist nie das vollständige Bild.
Es ist so, als würde man lernen, Xhosa zu sprechen.
Wenn Sie nicht auf Guru-Niveau streben, halten Sie sich am besten an das, was Sie wissen, und diese Klicks erschweren Ihr Leben .
Weil es Spaß macht.
quelle
Bisher lernte ich RPG II zunächst mit einem IBM System 32 und später APL auf einem 370. Bei mir ging es um Größe und Geschwindigkeit. Mein Mantra war kleiner und schneller. Assembly ist die kompakteste und schnellste Sprache auf dem Markt. Ich würde Testprogramme sowohl in C als auch in Assembly erstellen. Wo C-Programme 100 KB erfordern würden, wäre ein äquivalentes Assembly-Programm oft weniger als 5 KB. Wenn ich die Ausgabe des C-Compilers untersuche, finde ich Code, der Parameter überprüft und überprüft, um bedingte Überprüfungen auf mögliche Fehler durchzuführen, die häufig selten, exotisch und unnötig sind. All dies hat Zeit in Anspruch genommen, aber der größte Speicherüberhang hat absolut alles übergangen zum und vom Stapel.
In der heutigen Programmierumgebung bietet das Schreiben von Code ein zusätzliches Maß an Sicherheit und Schutz. Wenn Sie Informationen direkt von einer Hardware lesen können, auf die Hochsprachen keinen Zugriff haben, können Sie diese mit Assembly so verschlüsseln, dass ein Programm nur auf diesem bestimmten Computer verwendet werden kann. Verschlüsseln Sie beispielsweise einen Benutzerschlüssel mit der MAC-Adresse der Netzwerkschnittstelle, und parken Sie diesen Schlüssel dann auf einem bestimmten nicht registrierten Sektor der Festplatte. Markieren Sie dann den Sektor als fehlerhaft, damit andere Dateien ihn nicht überschreiben können. Natürlich verlierst du den Sektor, aber was ist das? 2048 oder 4096 Bytes aus Milliarden oder Billionen?
quelle