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 x
befindet sich in Register 1, y
in Register 2 und z
sollte 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.)