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

Zobacz też

Wbudowany asembler