Udostępnij za pośrednictwem


Definiowanie bloków __asm jako makr C

Specyficzne dla firmy Microsoft

C makra oferują wygodny sposób, aby wstawić kod do kodu źródłowego, ale żądają szczególną ostrożność, ponieważ makro jest rozwijana do pojedynczego wiersza logicznego.Aby utworzyć bezproblemowe makra, należy wykonać następujące czynności:

  • Należy ująć __asm zablokować w nawiasach klamrowych.

  • Umieścić __asm słowo kluczowe przed każdą instrukcję montażu.

  • Użyj starego stylu C komentarzy ( /* comment */) zamiast komentarze w stylu zestawu ( ; comment) lub Komentarze jednowierszowe C ( // comment).

Aby zilustrować, w poniższym przykładzie zdefiniowano proste makro:

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

Na pierwszy rzut oka, ostatnich trzech __asm słowa kluczowe wydają się zbędne.Są one potrzebne, jednak ponieważ makro rozszerza się w jednym wierszu:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

Trzecim i czwartym __asm słowa kluczowe są potrzebne jako separatory instrukcji.Separatory tylko oświadczenie uznane w __asm bloki są znak nowego wiersza i __asm słowa kluczowego.Ponieważ blok zdefiniowane jako makro jest jeden wiersz logicznych, należy oddzielić każdą instrukcję z __asm.

Niezbędne są również nawiasy klamrowe.Jeżeli je pominięto, kompilator może być mylony przez C lub C++ instrukcji w tym samym wierszu, na prawo od wywołania makra.Bez nawiasu zamykającego, kompilator nie może powiedzieć, gdzie zatrzymuje zestawu kodu i to widzi C lub C++ instrukcji __asm blok jako instrukcje montażu.

Komentarze w stylu zestawu, zaczynające się od średnika (;) do końca wiersza.To powoduje problemy w makrach, ponieważ kompilator ignoruje wszystko po komentarz, aż do końca wiersza logicznego.To samo dotyczy Komentarze jednowierszowe C lub C++ ( // comment).Aby zapobiec błędom, Użyj starego stylu C komentarzy ( /* comment */) w __asm bloków określona jako makra.

__asm Blok zapisano jako makro C mogą pobierać argumenty.W odróżnieniu od zwykłych C makrze, jednak __asm makro nie może zwracać wartości.Dlatego takie makra nie można używać w wyrażeniach C lub C++.

Uważaj, aby nie wywołać makra tego typu bez wyjątku.Na przykład, powołując się na odpowiednie makro języka asemblera w funkcji zadeklarowanych za pomocą __fastcall Konwencji może spowodować nieoczekiwane rezultaty. (Zobacz za pomocą i konserwowanie rejestrów w zestawie Inline.)

KONIEC informacji specyficznych dla firmy Microsoft

Zobacz też

Informacje

Asembler wbudowany