Kompilieren, Assemblieren?
-
Hallo,
was ist denn der Unterschied zwischen dem Kompilieren und dem Assemblieren?
Ist das nicht das gleiche?
Beim Kompilieren wird die Quellcode-Datei ja in Maschinencode übersetzt - also assembliert, oder?Thanks für Tipps!
-
Beim Kompilieren wird eine hochsprache in Maschinencode umgesetzt. Dabei werden die Strukturen komplett umgewurstet.
Beim Asemblieren passiert eine einfache 1:1-Übersetzung, asm-code ist ja nur eine leserliche Form des Maschinencode.
-
Hallo,
ganz verstanden habe ich das nicht.
Wenn ich ein C-Programm erstellen will, durchläuft es verschiedene Zyklen.
Eigentlich dachte ich das wären kompilieren, präprozessing und linken, aber da ist noch assemblieren. Was meinst du in Bezug auf das mit 1 zu 1 übersetzen?
Es wird der Maschinencode in asm-Code "gewechselt"?
D.h. dann, diese asm Übersetzung kommt vor dem Linken und nach dem Kompilieren?
Warum bleibt nicht der Maschinencode vorhanden, sondern wird zu asm-Code?Danke für Beantwortung dieser Fragen!
-
Original erstellt von <Ratlos>:
**
Wenn ich ein C-Programm erstellen will, durchläuft es verschiedene Zyklen.Eigentlich dachte ich das wären kompilieren, präprozessing und linken, aber da ist noch assemblieren.
**Wenn mans ganz genau nimmt macht z.B. der gcc es so:
1. Präprozessor
2. Kompilieren wandelt den C-Code in Assembler-Code um
3. Ein Assembler wandelt den Assembler-Code in Maschinencode um und erstellt eine Objektdatei
4. Der Linker packt alle Objektdateien zusammen, richtet dabei ncoh alle externen Symbole udn raus kommt die fertige Datei**
Was meinst du in Bezug auf das mit 1 zu 1 übersetzen?
Es wird der Maschinencode in asm-Code "gewechselt"?
**Wenn du einen Assembler-Code hast, dann wird exakt ein ASM-Befehl in einen Mashcinencode-Befehl umgesetzt, und zwar eindeutig. In C (und anderen Hochsprachen) wird ein Befehl sehr oft in mehrere Maschinensprachenbefehle umgesetzt und das auch nicht eindeutig. Ebenso können beim Konpilieren mehrere C-Befehle im maschinencode gemischt ausgeführt werden. All das hast du beim Assemblieren nicht.
**
D.h. dann, diese asm Übersetzung kommt vor dem Linken und nach dem Kompilieren?
Warum bleibt nicht der Maschinencode vorhanden, sondern wird zu asm-Code?
**Wie gesagt, genau genommen komtm beim C-Compiler nicht Maschinencode, sondenr ASM-Code raus.
-
assembler ist maschinensprache.
Die CPU versteht nur 'Opcodes' - das sind einfach 'wirre' zahlen.0x55 0x40 0x10
das lässt sich schwer lesen, aber ein
mov ax,dxist viel leserlicher
(achtung: die zahlen sind nur geraten)assembler ist einfach für uns blöde menschen da, um auch direkt mit dem computer reden zu können
assemblieren heißt, dieses mov ax,dx einfach mittels string replace in zahlen umzuwandlen (so ists zwar nicht 100% richtig, aber du kannst es dir so vorstellen)
compilieren dagegen ist eine nicht assembler sprache zu kompilieren.
Beispiel:
int a=1;
int b=2;
c=a+b;das könnte der compiler zuerst in assembler übersetzen:
mov edx,1 ; int a=1
mov ecx,2 ; int b=2
mov aex,edx ; c=a+b
add aex,ecx ; c=a+bwie du siehst wird aus c=a+b 2 assemlber befehle!
bei komplizierten sahen wie while(*str1++=*str2++); wirds natürlich wesentlich mehr!deshalb nennt man es kompilieren - denn eine 1:1 übersetzung kann nicht statt finden!
Linken ist, wenn objekt dateien (das sind dateien die bereits kompiliert bzw. assembliert wurden) zueinander 'zusammengefügt' werden.
objekt dateien beinhaltet bereits fertigen maschinencode. Der Linker packt diese objekt dateien quasi nur in einer zusammen (das ist nicht 100% richtig, aber du kannst dir das so vorstellen)Der Präprozessor durchläuft den C Code und ersetzt die Makros (bzw. folgt den #if, #ifndef, #endif,...)
Beispiel:
#define getchar() fgetc(stdin)
wenn du jetzt getchar schreibst, dann wird fgetc in wirklichkeit aufgerufen (so ist getchar zB beim VC++ 6 implementiert)Wie oben bereits beschrieben, die Reihenfolge ist:
Präprozessor
Compiler
(Assembler) - muss nicht sein, da C Code theoretisch auch direkt in Maschinensprache umgewandelt werden kann, aber ich kenne keinen Compiler der nicht assembliert
Linken
-
Stell Dir das so vor:
Ein Prozessor kennt keine Buchstaben, nur Zahlen. Jede Operation (Addition, Subtraktion, ansprechen von Speicher) hat eine bestimmte Nummer zugeordnet. sendet man diese Nummer an die CPU, so wird der entsprechende Befehl ausgeführt.
da aber keiner gerne mit Zahlen um sich wirft, hat man sich was einfallen lassen:man gab jeder Nummer einen Namen, beispielsweise mov ax, 05.
"mov ax" ist dabei der Befehl (bei intel hat er die Nummer B8(hex)), 05 ein Parameter.
Der Assembler tut nun nichts weiter, als das Ganze wieder in Zahlen umzusetzen
quasi : b80500
0500 ist der 16 Bit-Wert der Zahl 5. (ist ne andere Geschichte)Text ausgeben kann eine CPU übrigens nicht. Sie schiebt nur Zahlen an speicherstellen. Damit man das nicht jedes mal umständlich programmiert, gibt es inzwischen eben die Hochsprachen (interpreter/compiler), bei denen eine Anweisung manchmal hunderte von Assemblerbefehlen bedeutet.
Diese setzen das Ganze nach dem Parsen in Maschinencode um - und machen noch einiges mehr.
Ich hoffe, dass das klar geworden ist. Ansonsten fragen
cYa
DjR