Anfängerfrage zum sichern von Registern
-
HI!
Wenn ich Assembler in meinen C++ -Code einbaue, wann muss ich dann darauf achten, register zu sichern? Wie stehts mit XMM und FPU/MMX?
Vielen Dank und viele Grüße
Sören
-
wenn du inline-assembler benutzt:
_asm { ... };
werden vor dem asm-block alle register gesichert und danach wiederhergestellt.
visual studio (im gegensatz zu zb watcom) verfuegt leider ueber keine mechanismen dem compiler mitzuteilen, welche register veraendert werden und schraenkt so die optimierte einbettung des assembler-codes sehr ein.
sehr kleine assembler-funktionen haben also oft einen nicht zu vernachlaessigenden overhead.
ansonsten gilt grundsaetzlich: der compiler uebernimmt deinen assembler-code 1:1 und wendet keinerlei intelligenz darauf an.
um die fpu (da stack) musst du dich sowieso selber kuemmern.
wenn du mmx benutzt musst du auch "emms" machen (oder ausschliessen, dass zwischenzeitlich fpu-operationen ausgefuehrt werden).
-
hellihjb schrieb:
sehr kleine assembler-funktionen haben also oft einen nicht zu vernachlaessigenden overhead.
dafür gibts
__declspec(naked)
womit man sich um alles selber kümmern muss.
-
Also, ich fasse zusammen (a.k.a.: Hab ich das richtig verstanden?)
Ich benutze Visual C++ und sobald ich inline-Assembler benutze, sichert er alle Register und stellt nacher den Originalzustand wieder her. Da er das sehr stumpf macht erzeugt das bei kleinen Einschüben à la:
for(int i=0;i<100;i++) __asm { mov eax,1 }
oder so ähnlich einen riesen Overvead. Wie würde ich in diesem absurden Beispiel dann __declspec(naked) einsetzen?
Hab gelesen, dass dann prolog und epilog (wobei ich noch nichtmal genau weiß, was da drin steht) weggelassen werden, und man es logischerweise nur bei Funktionen benutzen kann. Auch bei Inline Assembler?__desclspec(naked)__asm { ... }
Vielen Dank!
Sören
-
nein, so gehts nicht. für einzelne blöcke innerhalb von funktionen musst du damit leben, dass alle register gesichert und wieder hergestellt werden. __declspec(naked) geht nur für funktionen. die haben dann weder prolog noch epilog-code, d.h. alle register unterliegen deiner verantwortung.
http://msdn2.microsoft.com/en-us/library/h5w10wxs(VS.80).aspx
__declspec(naked) int foo() { __asm { mov eax, 1 ret } }