C++ Assemblerausgabe des C++ Programms

Rossibaer

Lieutenant
Registriert
Apr. 2007
Beiträge
754
Hallo zusammen,

in VS 2005 habe ich die Möglichkeit während der Kompilierung meines C++ Quellcodes auch die entsprechenden Assemblerbefehle ausgeben zu lassen. Beim Anschauen sehe ich da ein in meinen Augen etwas merkwürdiges Konstrukt:

Code:
	mov	DWORD PTR _this$[ebp], ecx
	mov	ecx, DWORD PTR _this$[ebp]

Beide Zeilen entstammen dem Konstruktor einer meiner Klassen und stehen direkt hintereinander. Der Sinn dahinter ist mir noch nicht so bewußt. Kann mir einer etwas Input geben?

Grüße
Rossibaer
 
Dreh mal die Code-Optimierung voll auf - dann wird diese sinnlose Befehlskombination sicher verschwinden :p
 
Also hab ich doch richtig vermutet, das es wenig Sinn macht was da steht.
Werde dann mal mit den Optimierungseinstellungen experimentieren...

Interessant nur, das diese 2 Anweisungen in keinem für mich erkennbaren direkten Zusammenhang mit dem C++ Code stehen. Aber sei es wie es sei... Danke Woey für deine kurze pragmatische Antwort. Ich sollte wohl nicht wirklich alles hinterfragen, was sich da im Hintergrund abspielt oder ich schreib meinen eigenen Compiler der sowas vermeidet ;)
 
Zuletzt bearbeitet:
Also wenn ich einen leeren Konstruktor erstelle erhalt ich so ziemlich das Selbe:
Code:
01291800 89 4D F8         mov         dword ptr [ebp-8],ecx 
	{   
	}
01291803 8B 45 F8         mov         eax,dword ptr [this]

ecx ist dabei der Zeiger auf die in der Klasse verwendeten Variablen (data template). Wenn ich mich recht entsinne, gibt der Konstruktor diesen immer zurück (durch eax ).
 
Zuletzt bearbeitet:
Bei deinem Beispiel sehe ich zumindest noch einen Sinn, weil hier unterschiedliche Register verwendet werden. In meinem Fall wird jedoch der Inhalt von Register ecx nach DWORD PTR _this$[ebp] geschoben um dann wieder von DWORD PTR _this$[ebp] nach ecx zurück geschoben zu werden. Genau das war es, was mich stutzig machte. Kurze Zusatzinfo: Auch ich habe einen leeren Konstruktor in der Klasse verwendet. Das dennoch diverse Sachen im Hintergrund gemacht werden, war mir auch bewußt. Aber da ich erst am Anfang bin, was Assembler angeht, wollte ich halt nur wissen, ob es tatsächlich einen Sinn macht, was da vom Compiler ausgegeben wird.

Woey, danke für deine Infos, ich werde sie in Erinnerung behalten und ggfs. brauchen... Im übrigen kann ich auch bestätigen, das der Zeiger nach eax geschoben wurde.

Code:
mov	eax, DWORD PTR _this$[ebp]

Ich denke der Thread kann geschlossen werden, falls sonst niemand noch was dazu beitragen kann.

Viele Grüße
Rossibaer
 
Zuletzt bearbeitet:
Zurück
Oben