Korzystanie z rejestrów i zachowanie ich w zestawie wbudowanym

Specyficzne dla firmy Microsoft

Ogólnie rzecz biorąc, nie należy zakładać, że rejestr danej wartości po __asm rozpoczyna się bloku.Wartości rejestru nie są gwarantowane mają być zachowane w oddzielnym __asm bloków.Jeśli kończyć bloku kodu wbudowanego i rozpoczęcia następnego, nie można polegać na kas w drugim bloku do zachowania ich wartości z pierwszy blok.__asm Bloku dziedziczy zarejestrować niezależnie od wartości wynik z normalnego przepływu sterowania.

Jeśli używasz __fastcall konwencji wywoływania, kompilator przekazuje argumenty funkcji w rejestrach, a nie na stosie.Może to wywoływać problemy w funkcjach z __asm blokuje, ponieważ funkcja nie ma sposobu, aby powiedzieć, parametr, który jest w której rejestruje.Jeśli funkcja dzieje się otrzymywać parametr w EAX i natychmiast przechowuje coś innego w EAX, parametr oryginalny zostaną utracone.Dodatkowo, musi zachować rejestr ECX w dowolnej funkcji zadeklarowanych za pomocą __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 na całym świecie z opcją kompilatora przełączników /Gr oświadczają, każdy zawierający funkcję __asm blok z __cdecl lub __stdcall. ( __cdecl Atrybut informuje kompilator o konieczności używa konwencji wywoływania C dla tej funkcji.) Jeśli kompilacja nie z przełączników /Gr, uniknąć deklarowania funkcji o __fastcall atrybut.

Podczas korzystania z __asm asemblera pisać w języku C/C++ funkcji, nie trzeba zachować rejestry EAX, EBX, ECX, EDX, ESI lub EDI.Na przykład w POWER2.Przykład C w Funkcje pisanie za pomocą wbudowanego zestawu, power2 funkcja nie zachowuje wartość w rejestrze EAX.Jednak za pomocą tych rejestrów wpłynie na jakość kodu ponieważ program przydzielania rejestru nie można ich używać do przechowywania wartości przez __asm bloków.Ponadto za pomocą EBX, ESI lub EDI w wierszu zestawu kodu, można wymusić na kompilatorze do zapisywania i przywracania tych rejestrów w funkcji prologu i epilogu.

Należy zachować innych rejestrów korzystać (takie jak usługi Katalogowej, SS, SP, najlepszych praktyk i rejestrów flagi) zakres __asm bloku.Jeśli nie ma jakiegoś powodu, aby zmienić ich (Aby przełączyć stosy, na przykład), powinna zachować rejestry ESP i EBP.Zobacz też Optymalizacji zestawu Inline.

Niektóre typy SSE wymagają wyrównanie stosu ośmiu bajtów, zmuszając kompilator emitować kod dynamicznych wyrównanie stosu.Aby móc uzyskać dostęp do parametrów funkcji i zmiennych lokalnych po wyrównanie, kompilator obsługuje dwa wskaźniki ramki. Jeśli kompilator wykonuje pominięcie wskaźnik ramki (FPO), użyje EBP i ESP. Jeśli kompilator nie wykonuje Polinezji Francuskiej, użyje EBX i EBP.W celu zapewnienia kod działa poprawnie, nie należy modyfikować EBX w kodzie asm Jeśli funkcja wymaga wyrównania stack dynamicznej, jak można zmodyfikować wskaźnik ramki.Przenieś ośmiu bajtów typy wyrównany z funkcji lub EBX należy unikać.

[!UWAGA]

Jeśli kodu zestawu wbudowanego zmienia banderę kierunku przy użyciu instrukcji STD lub CLD, należy przywrócić bandery na pierwotną wartość.

KONIEC informacji specyficznych dla firmy Microsoft

Zobacz też

Informacje

Asembler wbudowany