Definiowanie bloków __asm jako makr C
Specyficzne dla firmy Microsoft
Makra języka C oferują wygodny sposób wstawiania kodu zestawu do kodu źródłowego, ale wymagają one dodatkowej staranności, ponieważ makro rozszerza się w jedną linię logiczną. Aby utworzyć makra wolne od problemów, wykonaj następujące reguły:
Ujęć
__asm
blok w nawiasy klamrowe.__asm
Umieść słowo kluczowe przed każdą instrukcją zestawu.Używaj komentarzy w starym stylu C (
/* comment */
) zamiast komentarzy w stylu zestawu (; comment
) lub komentarzy C jednowierszowych (// 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 ostatnie trzy __asm
słowa kluczowe wydają się zbędne. Są one jednak potrzebne, ponieważ makro rozszerza się w jeden wiersz:
__asm /* Port output */ { __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al }
Trzecie i czwarte __asm
słowa kluczowe są potrzebne jako separatory instrukcji. Jedynymi separatorami instrukcji rozpoznawanych w __asm
blokach jest znak nowego wiersza i __asm
słowo kluczowe. Ponieważ blok zdefiniowany jako makro jest jedną linią logiczną, należy oddzielić każdą instrukcję .__asm
Nawiasy klamrowe są również niezbędne. Jeśli je pominięto, kompilator może być mylony przez instrukcje języka C lub C++ w tym samym wierszu po prawej stronie wywołania makra. Bez zamykającego nawiasu klamrowego kompilator nie może określić, gdzie zatrzymuje się kod zestawu, i widzi instrukcje języka C lub C++ po __asm
bloku jako instrukcje dotyczące zestawu.
Komentarze w stylu zestawu rozpoczynające się średnikiem (;) są kontynuowane na końcu wiersza. Powoduje to problemy w makrach, ponieważ kompilator ignoruje wszystko po komentarzu, przez cały koniec wiersza logicznego. To samo dotyczy jednowierszowych komentarzy C lub C++ ( // comment
). Aby zapobiec błędom, użyj starych komentarzy języka C ( /* comment */
) w __asm
blokach zdefiniowanych jako makra.
Blok __asm
napisany jako makro języka C może przyjmować argumenty. Jednak w przeciwieństwie do zwykłego makra języka C makro __asm
nie może zwrócić wartości. Nie można więc używać takich makr w wyrażeniach języka C lub C++.
Należy zachować ostrożność, aby nie wywoływać makr tego typu bez konieczności masowego wywoływania. Na przykład wywołanie makra języka zestawu w funkcji zadeklarowanej za __fastcall
pomocą konwencji może spowodować nieoczekiwane wyniki. (Zobacz Używanie i zachowywanie rejestrów w zestawie wbudowanym).
END Microsoft Specific