Hallo,
in C? Nein.
Wenn Compiler und Linker mit ihrer Arbeit fertig ist, enthält der fertige ausführbare Code keine Informationen über Bezeichner und Typen mehr (ausgenommen Interface-Bereiche von Shared Objects/DLLs, oder wenn explizit Debug-Informationen generiert werden sollen).
Ich hab mir selten kompilierten C-Code angesehen
ich dagegen eine Zeitlang sehr oft, vor allem im Debugger, und ich habe unter DOS, später auch unter Windows gern und oft meine C-Programme mit kleinen Assembler-Einlagen aufgemöbelt. Daher weiß ich so ungefähr, wie der vom Compiler erzeugte Code aussieht.
aber selbst im Assembler brauche ich zu einem Wert zumindest das Register, indem er gespeichert wird.
Ja, stimmt. Aber lass uns ein Beispiel betrachten. Nehmen wir folgendes C-Fragment:
#define LSB(x) *((BYTE*)&x+0)
#define MSB(x) *((BYTE*)&x+1)
WORD w;
BYTE l,h;
w = 0x381A;
l = LSB(w);
h = MSB(w);
Das compilieren wir jetzt auf einer 16bit-CPU wie etwa dem 8086. Dann erhalten wir als Assembler-Ausschnitt beispielsweise folgenden Code:
MOV WORD PTR [0288], 381A
MOV AL,[0288]
MOV [028A],AL
MOV AL,[0289]
MOV [028B],AL
Aus diesem Code-Fragment erkennt man nicht mehr, dass die Adresse 0x0288 eigentlich einem WORD (16bit) zugeordnet war, man kann es höchstens aus der WORD-Zuweisung in der ersten Zeile noch vermuten.
Auch die Registerbreite ist nicht immer eine Hilfe: Es kann durchaus sein, dass der Compiler der Optimierung halber einen 16bit-Wert z.B. in EAX, also ein 32bit-Register lädt, um danach eine 32bit breite Rechenoperation durchzuführen.
Ich muss dir deine Aussage also erstmal glauben, weil ich es nicht weiss ;)
Danke für den Vertrauensvorschuss. :-)
Schönen Abend noch,
Martin
Eine Neandertaler-Sippe sitzt in ihrer kalten Höhle. Seufzt der Stammesälteste: "Hoffentlich erfindet bald jemand das Feuer!"
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(