for loop im disassembler
-
Habe mir mal folgenden code im disassembler angeguckt :
C++ code:
http://i.gyazo.com/4871fbf08a898ff8ae087b7c1343a4c0.png'asm' code:
http://i.gyazo.com/44b39f88ee0e07fe1c9a3f178d5ee890.pngEs scheint so als würde der compiler einfach den loop in ein:
ADD EAX, 0A
umwandeln. Warum tut der compiler das ? Gibt es dann überhaupt loops im 'maschinen code'?
(Visual Studio 2013
Intel
Windows 7)(Entschuldigt meine Vermischung von Begrifflichkeiten wie asm, disassembler und maschinen code)
-
Bitte den Code hier reinkopieren und keine Screenshots.
Der Compiler kann "optimieren" und so einfache Schleifen optimiert er weg. Türlich kann der Prozessor sowas wie loop. Mach die Anzahl der Durchläufe abhängig von einer Eingabe und mach die Rechnung komplizierter, dann optmifizipliziert er nix weg.cin>>o; for(int i=0;i<o;++i) r=cos(r)+i; cout<<r;
Sogar die Ausgabe von r ist lebensnotwendig, wenn sie fehlt, kann der Compiler das gesamte teure Programm wegoptmifiziplizieren.
-
ADD EAX 0A (Additert 10 zum Wert in EAX hinzu)
und nicht
MOV EAX 0A (Setzt EAX auf 10)Der Compiler analysiert den Code und bemerkt: Da wird effektiv nur i+=10 ausgeführt. Somit wird die Schleife wegoptimiert und durch eine simple Addition ersetzt, welche weitaus weniger Rechenzeit benötigt.
Schleifen werden in der Regel durch Sprünge (JMP/JE/JL etc.) implementiert.
Hier mal beispielsweise für deinen Code ohne Compileroptimierungen:
-
Danke für die hilfreichen Antworten!