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