Assemblerroutine bringt Rechner zum absturz
-
Hi,
die speicherbereiche sind richtig. Ich habe was interessantes rausgefunden:
Wenn ich das hier mache mit CMatrix c = this; funzt es einwandfrei!
void CMatrix::identity (void) { #ifdef _OLD_MATH this->_11 = this->_22 = this->_33 = this->_44 = 1.0f; this->_12 = this->_21 = this->_31 = this->_41 = this->_13 = this->_23 = this->_32 = this->_42 = this->_14 = this->_24 = this->_34 = this->_43 = 0.0f; #else const float a = 1.0f; const float b = 0.0f; CMatrix *c = this; __asm { mov eax, c mov ebx, a mov ecx, b mov [eax],ebx mov [eax+14h],ebx mov [eax+28h],ebx mov [eax+3Ch],ebx mov [eax+30h],ecx mov [eax+0Ch],ecx mov [eax+8],ecx mov [eax+4],ecx mov [eax+34h],ecx mov [eax+1Ch],ecx mov [eax+18h],ecx mov [eax+10h],ecx mov [eax+38h],ecx mov [eax+2Ch],ecx mov [eax+24h],ecx mov [eax+20h],ecx } *this = *c; #endif }
Warum ist das so, und wie kann ichs machen, dass ich nicht this benutzen muss sondern direkt auf das Floatarray 'matrix' zugreifen kann?
-
*push* plz help
-
In ecx liegt glaub ich der this pointer in Visual C++. Deshalb bloß nicht überschreiben.
-
liegt daran weil ich darin den this pointer rein gestopft habe? aber frage wie ich direkt auf das array zugreifen kann?
-
Vielleicht auch &matrix verwenden. Aber es stimmt schon, inline Assembler ist immer ein bisschen mühsam, weil man nie so ganz sicher sein kann, was der Compiler genau damit macht.
-
hatte ich auch schon ausprobiert:
mov eax, &matrix
diese zeile macht das hier:
error C2400: inline assembler syntax error in 'second operand'; found 'AND'
-
wenn dann:
mov eax,offset matrix
oder etwa nicht?
-
bringt das hier:
error C2415: improper operand type
-
@Nobuo T
kannst du nicht helfen?
-
Hi.
Versuchs mal mit
lea eax, [matrix]
(habe gerade kein VC++ installiert, also keine Ahnung ob das funktioniert)
-
Hi,
da bekomm ich diesen Fehler:
error C2415: improper operand typedas ist so gemein
-
kann mir den keiner helfen?
-
Schonmal geguckt, was der Compiler aus deinem alten Code macht?
Ist vielleicht noch ein Ansatzpunkt.
Solange du mir hier keinen Rechner mit VC++ herzaubern kannst, bleibt dir wohl nur selber probieren und weiter warten.
-
Nobuo T schrieb:
Schonmal geguckt, was der Compiler aus deinem alten Code macht?
Ist vielleicht noch ein Ansatzpunkt.
Solange du mir hier keinen Rechner mit VC++ herzaubern kannst, bleibt dir wohl nur selber probieren und weiter warten.Hast du nun VC++? Bisher konnte ich nichts dran rausfinden
-
Ja, hast Glueck, dass mir in den Ferien so langweilig geworden ist, dass ich das Monstrum mal wieder ausgepackt habe.
Folgendes liess sich compilieren und ist zumindest nicht abgestuerzt:void CMatrix::identity (void) { const float a = 1.0f; const float b = 0.0f; _asm { lea eax, this mov ebx, a mov ecx, b //...
-
Ist aber auch nur Glückssache, dass das float array gleich am Anfang steht, und geht auch nur, solange keine virtuals da sind.