Za pomocą i konserwowanie rejestrów w zestawie Inline
Programu Microsoft
Ogólnie rzecz biorąc, nie należy zakładać rejestr że danej wartości po __asm rozpoczyna się w bloku.Wartości rejestru nie są gwarantowane mają być zachowane przez oddzielne __asm bloków.Jeśli blok kodu wbudowanego zakończenia i rozpoczęcia następnego, nie można polegać na rejestrów w drugim bloku, aby zachować ich wartości z pierwszej bloku.__asm Bloku dziedziczy zarejestrować niezależnie od wartości wynik z normalnego przepływu sterowania.
Jeśli korzystasz z __fastcall konwencji wywoływania, kompilator przekazuje argumenty funkcji w rejestrach, zamiast na stosie.To utworzenie problemy w funkcji z __asm blokuje, ponieważ funkcja ma parametr, który jest w rejestrze, które sposobu.Jeśli funkcja się nie dzieje otrzymywać parametr w EAX i natychmiast przechowuje czegoś w EAX, parametr oryginalnej zostaną utracone.Dodatkowo, musi zachować rejestr ECX w dowolnej funkcji zadeklarowanych z __fastcall.
Aby uniknąć takich konfliktów rejestru, nie należy używać __fastcall Konwencji o funkcje, które zawierają __asm bloku.Jeśli określisz __fastcall Konwencji globalnie z opcją kompilatora się przełączników /Gr, oświadczyć, każdy zawierający funkcję __asm zablokować z __cdecl lub __stdcall.( __cdecl Atrybut nakazuje kompilatorowi, aby użyć c konwencja wywołania dla tej funkcji.) Jeśli użytkownik nie są kompilacji z się przełączników /Gr, należy unikać deklarowania funkcji z __fastcall atrybut.
Podczas korzystania z __asm , do pisania asemblera funkcje c i C++, trzeba zachować rejestrów EAX, element EBX, ECX, EDX, ESI lub EDI.Na przykład w POWER2.C przykład w Piśmie funkcje za pomocą wbudowanej zestawu, power2 funkcja nie zachowuje wartości w rejestrze EAX.Jednakże przy użyciu tych rejestrów wpłynie jakość kodu, ponieważ program przydzielania rejestru nie można ich używać do przechowywania wartości między __asm bloków.Ponadto przy użyciu kodu zestawu wbudowanego element EBX, ESI lub EDI, życie kompilatora do zapisywania i przywracania tych rejestrów w funkcji prologu i epilogu.
Powinna zachować innych rejestrów, użyj (takich jak DS, SS, PS, BP i rejestry flagi) dla zakresu __asm bloku.Rejestry ESP i EBP powinna zachować, chyba że niektóre przyczyny, aby zmienić je (do stosów, przełącz się na przykład).Zobacz też Optymalizacja zestawu Inline.
Niektóre typy SSE wymagają wyrównanie stosu ośmiu bajtów, wymuszanie emitują kod dynamicznych wyrównanie stosu kompilatora.Aby móc uzyskać dostęp zarówno lokalnych zmiennych i parametrów funkcji po wyrównanie, kompilator utrzymuje dwa wskaźniki ramki.Jeśli kompilator wykonuje pominięcie wskaźnik ramki (ang.), będzie korzystać, EBP i ESP.Jeśli kompilator nie wykonuje Polinezji Francuskiej, użyje element EBX i EBP.Aby upewnić się, kod działa poprawnie, nie należy modyfikować element EBX w kodzie asm Jeśli funkcja wymaga wyrównanie stosu dynamicznych, jak można go zmodyfikować wskaźnik ramki.Przenieść typów wyrównany ośmiu bajtów z funkcji albo unikać element EBX.
[!UWAGA]
Jeśli kodu zestawu wbudowanego zmienia banderę kierunek, za pomocą instrukcji STD lub CLD, Flaga musi przywrócić pierwotną wartość.
KONIEC Microsoft szczególne