Grundsätzliches zu Assembler
-
Hallo zusammen,
ich bin ein blutiger Anfänger in Assembler und habe ein paar Fragen dazu:
1.) Jede CPU hat einen eigenen integrierten Befehlssatz, mit dem sie angesprochen werden kann. Nun ist Assembler ja äquivalent mit Maschinensprache, nur dass Grundbefehle durch Abkürzungen ersetzt wurden (ADD == 10). Bedeutet das, dass eigentlich gar nicht DIE Assemblersprache gibt, sondern einen Assembler für jede CPU Architektur gibt? Was ich meine: Hat jede CPU Architektur ihre eigene Assemblersprache?
2.) Heißt Assemblieren nur, dass die Platzhalter (z.B. ADD) durch Zahlen ersetzt werden? Liegt der Unterschied zum Compilieren darin, dass beim letzteren komplexere Datenstrukturen wie Schleifen etc. aufgelöst werden? Das Ergebnis ist ja in beiden Fällen gleich: Es kommt Maschinensprache heraus. Warum also zwei unterschiedliche Begriffe?
Vielen Dank
lg, freakC++
-
Ich lese gerade den zweiten Satz im Wikipedia Artikel "Assemblersprache":
"Jede Computerarchitektur hat folglich ihre eigene Assemblersprache."
Damit hätte sich Frage 1 geklärt :).
-
freakC++ schrieb:
2.) Heißt Assemblieren nur, dass die Platzhalter (z.B. ADD) durch Zahlen ersetzt werden? Liegt der Unterschied zum Compilieren darin, dass beim letzteren komplexere Datenstrukturen wie Schleifen etc. aufgelöst werden? Das Ergebnis ist ja in beiden Fällen gleich: Es kommt Maschinensprache heraus. Warum also zwei unterschiedliche Begriffe?
Assembler-Codes sind halbwegs für den Menschen lesbar, Maschinencode nicht. Aber ansonsten stimmt es schon, daß du Maschinencode und Assembler fast 1:1 ineinander übersetzen kannst. Höhere Sprachen verwenden kurze Anweisungen für komplexere Aufgaben, die durch den Compiler dann in Maschinencode übersetzt werden können.
-
Compiler ist auch ein recht allgemeiner Begriff. Es geht dabei nur um die Umwandlung eines Programms von einer Sprache in eine andere Sprache. Früher gabs z.B. Compiler die C++ Code in C umgewandelt haben, um diese dann durch einen vorhandenen C Compiler zu jagen. Heutzutage erzeugt soweit ich weiß der gcc als Endprodukt auch immer noch Assemblercode, der dann von as assembliert wird.
Ansonsten ist ein Assembler einer einfachen Textersetzung näher als einer Analyse die ein Compiler durchführt. Der Assembler erzeugt wie du schon sagtest hauptsächlich den Maschienencode, ersetzt evtl. zusammengesetzte Befehle mit einzelne und fügt Adressen in Platzhalter.
-
Ah..super! Danke. Mir ist noch ein weiterer Unterschied eingefallen. Der Compilierer besteht ja eigentlich aus mehreren Programmen wie Debugger und Optimierer. Der Assembler ist wie ihr ja bereits gesagt habt eigentlich nur ein Textersetzungsprogramm.
Bis dann
freakC++
-
Der Debugger ist eigentlich kein Teil des Compilers, eher ein Teil der IDE. Compiler und Debugger arbeiten nur häufig zusammen, indem der Compiler genug Informationen im fertigen Programm zurücklässt, damit der Debugger dir mitteilen kann, an welcher Stelle des ursprünglichen Programms du gerade unterwegs bist.
-
freakC++ schrieb:
Der Assembler ist wie ihr ja bereits gesagt habt eigentlich nur ein Textersetzungsprogramm.
Nein, so einfach ist der Assembler nicht. Versuch mal, einen zu schreiben, dann weisst du es
-
Das hat sich jetzt vielleicht primitiv angehört, aber das habe ich nicht gemeint. Aber so wie ich das Verhältnis zwischen Assembler und Maschinencode verstanden habe, wurden bei Assembler Befehle durch Abkürzungen ersetzt wie eben ADD == 10 ist. Dies erleichtert die Arbeit für den Menschen. Was macht denn der Assembler noch, außer zu resubstituieren?
Vielen Dank euch allen
lg, freakC++
-
freakC++ schrieb:
Was macht denn der Assembler noch, außer zu resubstituieren?
Sprungziele sammeln.
Den richtigen der add-Ausprägungen raussuchen anhand der Parametertypen und der Adressierungsart.
-
Er ersetzt zum Beispiel Sprungziele oder "Variablen" durch Adressen
db foo 0 loop: mov eax,foo jmp loop
(Ich habe schon lange nicht mehr Assembler programmiert, also kann gut sein dass das hier von der Syntax her nicht ganz stimmt, es dürfte aber klar sein was gemeint ist)
Der Assembler würde hier foo durch die Adresse von foo ersetzen und loop durch die Adresse von "mov eax,foo"
Je nachdem wie mächtig der Assembler ist gibt es eventuell noch mehr Features.
Aber ein extrem simpler Assembler würde wirklich nur die Instruktionen ersetzen (den kann man auch als Anfänger recht leicht schreiben, es macht aber keinen Spaß glaube ich weil es eigentlich zu 90% aus aufbauen einer Mnemonic - Opcode Tabelle besteht^^)
-
Das Beispiel mit den Sprungziele ist gut. Das ist ja auch schön in der von-Neumann-Architektur mittels des Befehlszählers festgehalten.
Ich habe nochwas vergessen. Ein Compiler verfügt über einen Linker, der meines Wissens ein eigenständiges Programm ist. Der Linker gehört eher zum Compiler als zur IDE, denn er wird im Gegensatz zum Debuuger immer gebraucht.