Inline Assembler[c++]

Hi, wollte mal fragen wie das ist wenn ich nämlich folgendes mache:

Code:
int iInput = 5;
__asm
{
mov eax, iInput
}
cout << "lol" << endl;
__asm
{
mov iInput, eax
}
cout << iInput << endl;
Dann sagt er mir, dass iInput nicht wie ich erwartete 5 ist, sondern irgendwie so 8142234......

Scheint ja auch klar zu sein was passiert ist, cout hat den Register überschrieben.
Jetzt aber ist meine Frage ob nicht auch von dem Programm unabhängige Prozesse den Register ändern können, oder ist so ein Block sicher, wie:
Code:
__asm
{
mov eax, iInput
mov iInput, eax 
}
im Gegensatz zu:
Code:
__asm
{
mov eax, iInput
}
__asm
{
mov iInput, eax 
}
?
Danke im Vorraus
 
Also erstmal eine Grundlage, wie dein Betriebssystem mit Registern umgeht. Jeder Thread hat seinen eigenen Kontext.

Code:
_asm mov reg, var
[...]
_asm mov var, reg

[...] heißt: hier kann ein beliebiger Code stehen, Hauptsache ist, er veraendert die Register nicht. Registerinhalte werden haeufig durch das Aufrufen von Funkionen zerstoert, gerade der eax Register, da in diesem die Returnergebnisse gespeichert werden. Es gibt aber auch Funktionen die die Registerinhalte vorher speichern (pushf pushad) und am Ende wieder restorn (popad popf).
 
Zurück
Oben