Assembler-Grundfrage: Übersetzung in Maschinencode

Wie arbeitet ein Assembler (auf sehr grundlegender Ebene) bei der Übersetzung der Assemblersprache in Maschinencode?

[Mein Verständnis ist, dass, wenn ein Programm geschrieben wird, es in Text geschrieben wird und Assembler diese "Texte" dann in Bits umwandelt, die der Computer versteht. Wenn ich zum Beispiel MOV A, B geschrieben habe, wird dies mit Hilfe der "Tastatur" (in 0s & 1s, die im Grunde elektrische Impulse sind) im Speicher gespeichert. Da diese gespeicherten Bits nun Bits enthalten, die Alphabeten wie 'M', 'O', 'V' (dem ASCII-Code) usw. entsprechen, vergleicht der Assembler nun diese im Speicher gespeicherten Bits (die sind entsprechend den "Texten") zu den bereits in "Assembler" gespeicherten Bits. Die Textbits (MOV…) passen also zu einigen dieser Assemblerbits (von vielen Bitgruppen, die mit anderen Schlüsselwörtern wie MVI, ADD ) und als Ergebnis dieser Vergleiche wird "opcode" in Bezug auf "MOV"-Text ausgegeben. Liege ich richtig oder ist das eine falsche Denkweise? ]

Besuchen Sie die Website von Antoine VIGNAU und Olivier ZARDINI und lesen Sie die Seiten dort und laden Sie ihren Quellcode herunter. Diese Assembler-Quelle ist vollständig verfügbar, ist relativ einfach, unterstützt verschiebbare Objekte und führt auch alle erforderlichen Verknüpfungsschritte aus. Es ist alles in einem. Kann das nicht schlagen. Das Lesen des Codes wird alle Ihre Fragen beantworten. Siehe: brutaldeluxe.fr/products/crossdevtools/merlin (für das zu verwendende Symbol gehen Sie ganz nach unten auf der Seite.) Oder besuchen Sie: infinitefactors.org/jonk/patch.html für eine modifizierte Version davon.
Beispiel: Wenn ich MOV A, B in RAM eingebe: 'M' >> einige Bytes (ASCII-CODE) im Speicher (RAM) in Form von 0 V und 5 V (Spannung kann unterschiedlich sein, aber Sie wissen, was ich meine), wird 'O' gleich gespeichert werden und so V , A , "," , B . Jetzt hat die Programmiersoftware auch den Teil im RAM, den wir "Bibliothek" nennen, der in 0s & 1s in Form von 0v /5v gespeichert ist. Meine Frage ist also, dass dies der Fall ist "Übersetzung" bedeutet, dass die eingegebenen 0s, 1s von MOV A, B mit gespeicherten 0s und 1s (Bibliotheken) durch logisches ckt verglichen werden und dann je nach Übereinstimmung oder Nichtübereinstimmung dieser 0s, 1s zu weiteren 0s, 1s führen ( Opcodes, werden im RAM gespeichert und ausgeführt)? @jonk
Ein Assembler verarbeitet nur Tokens und generiert Dateien. Manchmal sind dies Objektdateien. Manchmal sind es Binärdateien. Hängt davon ab, was Sie tun möchten. So oder so, sie sind nur "Daten". Ein anderes Gerät liest beispielsweise eine Binärdatei vollständig aus und überträgt diese Daten in ein Hardwaregerät (wie ein ROM oder den Flash-Speicher eines Mikrocontrollers). Wie das erreicht wird, hängt vom Gerät ab. Einige Geräte benötigen 12 oder 13 Volt, um Daten zu schreiben, obwohl sie normalerweise mit 5 V arbeiten. Abgesehen davon bin ich mir nicht sicher, wo Sie sich befinden, daher ist es schwierig zu wissen, was Sie hinzufügen sollen.
Ich möchte nur einen Einblick in das bekommen, was tatsächlich im RAM passiert, wenn Leute sagen, dass "Assembler die Assemblersprache in Maschinensprache übersetzt" auf Schaltungsebene in einfachen Worten. Es ist vielleicht nicht sehr technisch, aber logisch.
Ohne den technischen Wortschatz und unter Vermeidung ausgefallener Funktionen "konvertiert der Assembler den Quellcode in eine sequentielle Reihe von Bytewerten mit einer Länge von N Bytes, die in einen Speicher übertragen werden, beginnend an einer Adresse und fortgesetzt für N Speicherbytes."

Antworten (1)

Tatsächlich wird die 'Konvertierung' zwischen der vom Benutzer eingegebenen Textdatei und dem tatsächlichen (binären) Assembly-/ausführbaren Code von einem speziellen Programm durchgeführt, das als Assembler bezeichnet wird.

Es ist ein Textparser, der den gesamten Text stückweise parst (z. B. zuerst 'MOV', dann seine Operanden/Argumente. Einer nach dem anderen wird übersetzt (und Elemente können bei Bedarf gespeichert werden).

Parses basieren auf Regeln, wenn also zB 'M', 'O', 'V' in einer Textdatei gefunden wird, weiß es, dass es zB in Opcode 0x40 übersetzt werden muss. Und es weiß auch, was danach zu erwarten ist (Argumente). Wenn diese korrekt sind, werden diese Argumente übersetzt, andernfalls wird eine Fehlermeldung angezeigt.

Auch die Optimierung erfolgt innerhalb des Assemblers und andere Einstellungen, die den Binärcode betreffen.

Update (lt. Kommentar):

Schritte:

  1. Der Benutzer erstellt mit einem Texteditor den Assemblercode in Textform (zB mit Befehlen als Text wie MOV 1, A, SUB ...
  2. Dies wird auf der Festplatte in einer Datei gespeichert, z. B. program.a
  3. Der Benutzer führt ein Assembler-Programm aus
  4. Dieses Programm liest die Datei program.a in den Speicher.
  5. Es übersetzt Wort für Wort und Operand für Operand den Text mit Hilfe eines Parsers. Der Text wird in Opcodes und Operanden übersetzt.
  6. Meistens gibt es einen Optimierungsschritt, der unnötige Opcodes entfernt oder in bessere/schnellere ändert.
  7. Diese Opcodes und Operanden werden in einer anderen Datei gespeichert, z. B. program.exe (die ausführbare Datei).
  8. Beim Ausführen des Programms wird die Datei program.exe in den Speicher eingelesen.
  9. Der Computer/Mikrocontroller führt den Code im Speicher aus.
Es sieht so aus, als ob mein mit der Frage geschriebenes Verständnis richtig ist. Ist es? :P
Ja, außer dass es normalerweise nicht auf Bitebene ist, sondern Bytes oder eigentlich "Text" -Zeichen gelesen und in Opcodes übersetzt werden. Der Assembler erstellt eine ausführbare Datei, die im Speicher gespeichert und Anweisung für Anweisung ausgeführt wird.
Ich denke, "Lesen und Übersetzen" ist für mich verwirrend, weil Assembler nur bestimmte im Speicher gespeicherte Bits / Bytes (ASCII-Code englischer Texte beim Programmieren) durch die Bits / Btyes (Opcodes) ersetzt, die im Computer funktionieren.
Eigentlich spielt es keine große Rolle, ob es für die Übersetzung im Speicher oder in einer Datei auf der Festplatte gespeichert wird. Ich versuche, es in meine Antwort aufzunehmen
Ich weiß, dass die Bearbeitung, die Sie in Ihrer Antwort vorgenommen haben, alle Zweifel für eine wissende Person ausräumen sollte. Aber mein Herr, ich bin Anfänger in Computerorganisation und -architektur + Programmiersprachen. Ich kenne Parsing nicht (obwohl ich wenig Gefühl dafür habe), auch das Wort "Übersetzung" verwirrt mich jedes Mal. Ich denke, ich möchte nur wissen, was im Speicher (RAM) passiert, wenn ich anfange, etwas auf meinem " Programmiersoftware". 1/2
Beispiel: Wenn ich MOV A, B in RAM tippe: 'M' >> einige Bytes (ASCII-CODE) im Speicher (RAM) in Form von 0 V und 5 V (Spannung kann unterschiedlich sein, aber Sie wissen, was ich meine), wird 'O' gleich gespeichert werden und so V , A , "," , B . Jetzt hat die Programmiersoftware auch den Teil im RAM, den wir "Bibliothek" nennen, der in 0s & 1s in Form von 0v /5v gespeichert ist. Meine Frage ist also, dass dies der Fall ist "Übersetzung" bedeutet, dass die eingegebenen 0s, 1s von MOV A, B mit gespeicherten 0s und 1s (Bibliotheken) durch logisches ckt verglichen werden und dann je nach Übereinstimmung oder Nichtübereinstimmung dieser 0s, 1s zu weiteren 0s, 1s führen ( Opcodes werden im RAM gespeichert und ausgeführt)?2/2
Ich weiß nicht, ob ich verstehe, was du sagst ... vielleicht ist es am besten, wenn du zuerst versuchst, den Unterschied zwischen einem Editor (wo du das Programm eingibst und es in einer oder mehreren Dateien speichert), einem Compiler (der wandelt den lesbaren Text in Maschinen-Opcodes um, was im Wesentlichen ein Parser ist) und führt ein Programm aus (führt es aus). Der Editor kann auf einer anderen Plattform (wie einem PC) als der Ausführende (Mikrocontroller) arbeiten. In diesem Fall wird der Compiler als Cross-Compiler bezeichnet.
Jedes laufende Programm wird (im Wesentlichen) aus dem RAM ausgeführt, dh die Ausführung, der Editor, der Compiler. Und RAM wird physikalisch aus Bits aufgebaut, die intern als 0 für 0 V und 1 für höher behandelt werden (1,8 V, 3,3 V oder 5 V usw.). Der Compiler hat beispielsweise keine Kenntnis von 0 V und 5 V, dies wird von der CPU/dem Mikrocontroller und der umgebenden Hardware gehandhabt.