Warum brauchen wir Assemblersprache?

27

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?

Nithin Jose
quelle
13
Assembler ist von Menschen lesbarer Maschinencode, deshalb.
Andrej Bauer
4
Weil es wichtig ist zu wissen, wie die Dinge funktionieren, wenn wir in der Nähe der Hardware sind. Wenn wir Assembler schreiben, verstehen wir, wie die Hardware des Computers auf einer niedrigen Ebene funktioniert und funktioniert. Der beste Weg dafür ist die Assemblersprache, da die Maschinensprache langwierig und nicht lesbar ist wie die Assemblersprache. Würden Sie es wirklich vorziehen, eine magische Schachtel zu verwenden und niemals hinein zu schauen?
Spencer Wieczorek

Antworten:

32

"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?"

Obwohl es stimmt, werden Sie wahrscheinlich nicht feststellen, dass Sie die App Ihres nächsten Kunden in Assembler schreiben. Es gibt jedoch noch viel zu gewinnen, wenn Sie Assembler lernen.

Heutzutage wird Assemblersprache hauptsächlich für die direkte Hardwaremanipulation, den Zugriff auf spezielle Prozessoranweisungen oder zur Behebung kritischer Leistungsprobleme verwendet. Typische Anwendungen sind Gerätetreiber, Embedded-Systeme auf niedriger Ebene und Echtzeitsysteme.

Die Assemblersprache ist so nahe am Prozessor wie Sie es von einem Programmierer gewohnt sind. Ein gut gestalteter Algorithmus ist also unübersehbar - Assemblersprache ist ideal für die Geschwindigkeitsoptimierung. Es geht um Leistung und Effizienz. Assemblersprache gibt Ihnen die vollständige Kontrolle über die Systemressourcen. Ähnlich wie bei einer Fertigungsstraße schreiben Sie Code, um einzelne Werte in Register zu verschieben und Speicheradressen direkt zu verarbeiten, um Werte oder Zeiger abzurufen. (Quelle: codeproject.com )

TylerAndFriends
quelle
29

Warum brauchen wir Assemblersprache?

Nun, es gibt tatsächlich nur eine Sprache, die wir jemals brauchen werden , nämlich "Maschinensprache" oder "Maschinencode". Es sieht aus wie das:

0010000100100011

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:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

Diese Werte entsprechen:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

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

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

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:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

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:

z = x + y

Das klingt genau so, als würde unser Zusatz von oben vorausgesetzt, er xbefindet sich in Register 1, yin Register 2 und zsollte in Register 3 enden. Aber was ist mit dieser Zeile?

z = x * 2 + (y / 6) * p + q - r

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:

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

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

Chris Cooper
quelle
2
Grundsätzlich hindert uns nichts daran, CPUs zu bauen, die direkt mit Assembler arbeiten. ASCII ist nur eine ineffiziente Kodierung für diesen Zweck, das ist alles.
Raphael
Danke für den Zusatz. Ich stimme zu, überspringe dies jedoch, um den Zweck der Versammlung zu verstehen. Ich werde eine Notiz hinzufügen.
Chris Cooper
15

Warum wurde die Assemblersprache erstellt? oder war es derjenige, der noch vor der Hochsprache an erster Stelle stand?

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 .

Warum lerne ich in meinem Computerkurs über Monteure?

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.

Guy Coder
quelle
14

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.

Raphael
quelle
4

Hier gibt es Antworten:

Alle diese Antworten deuten auf Folgendes hin:

  • Geschwindigkeits- / Speicheroptimierung
  • Verstehen, wie die Maschine funktioniert
  • So werden Noob-Programmierer zu Experten
  • Wenn Sie Assembler kennen, wissen Sie, wie Sie Compiler für Ihre High-Level-Sprache schreiben
  • etc
compski
quelle
1
Teilen Sie all diese Ansichten? Was ist Ihre Erfahrung? (Insbesondere der Artikel "So werden Noob-Programmierer zu Experten" scheint mir um einige Jahrzehnte veraltet zu sein.)
Raphael
woah woah du musst bei diesem Thema nicht so empfindlich sein. Ich verlinke nur Antworten auf seine doppelte Frage. Und die „So Noob Programmierer geworden Experten“ war am höchsten gestimmt hier . Gehen Sie mit ihm streiten nicht ich =)
Compski
1
Ich bin nicht empfindlich, ich versuche Ihnen zu helfen, Ihre Antwort gut zu machen (derzeit ist dies nicht der Fall, da Sie nur auf einige Ressourcen verweisen, von denen keine die Frage vollständig beantwortet). Ein erster Schritt dazu ist es, die eigenen Gedanken vergleichend einzubeziehen. (Beachten Sie, dass Sie ihnen einen Wert zuweisen, indem Sie die Meinung in einer ausschließenden Weise in Beziehung setzen. Mit anderen Worten, Sie müssen in der Lage sein zu argumentieren, warum Sie die Meinung genug bewerten, um eine Antwort (erneut) zu veröffentlichen.)
Raphael
Nun, meine Erfahrung ist, dass ich es wirklich hasse und mit dem Erlernen von Assemblersprachen zu kämpfen habe, nachdem ich mich an einige Programmiersprachen auf hohem Niveau gewöhnt habe. Und ich kenne diejenigen, die gute Programmierer sind oder C ++ / C im Voraus kennen, die in ASM ziemlich gut programmieren können. Ich habe nicht gedacht, dass meine Meinung bewertet wurde, um in meiner Antwort veröffentlicht zu werden. Deshalb ...
compski
Dein erster Link ist kaputt.
Hola Soy Edu Feliz Navidad
1

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:

  • Anleitung lernen und was sie bedeuten (duh).
  • Verstehen, was die Anweisung tut, was sie nicht tut und all ihre Nebenwirkungen .
  • Lernen, wie eine CPU die Anweisungen verarbeitet
    • Wie funktioniert die Pipeline?
    • Was multiscalar bedeutet
    • Was ist ein CPU-Kern?
    • Wie der Cache funktioniert.
    • Verstehen, wie man zyklisch zählt
    • die Lehren von Agner Fog lernen
  • Verstehen, wie Compiler Code generieren und wie sie manchmal fehlschlagen.
  • Optimierung klar definierter und sehr spezifischer Probleme.

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

Johan - Setzen Sie Monica wieder ein
quelle
1
Die häufigste Verwendung des Wortes grok in einem Artikel, dem ich jemals begegnet bin
rekciltnuc
-1

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?

Brian3163
quelle
1
Was bedeutet überhaupt "für Hochsprachen nicht zugänglich"?
David Richerby