Udostępnij za pośrednictwem


Definiowanie bloków __asm jak makra c

Programu Microsoft

C makra oferują wygodny sposób, aby wstawić kod zestawu do kodu źródłowego, ale popytu ostrożność, ponieważ makro rozwija się w jednej linii logicznej.Aby utworzyć bezproblemowe makra, należy wykonać następujące czynności:

  • Należy ująć __asm zablokować w nawiasy klamrowe.

  • Umieścić __asm słowa kluczowego na początku każdego zestawu instrukcji.

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

Aby zilustrować, w poniższym przykładzie zdefiniowano prostych makr:

#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 wydaje się zbędne.Są one potrzebne, jednak ponieważ makro rozwija się w jednym wierszu:

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

Trzecia i czwarta __asm słowa kluczowe są potrzebne jako separatory instrukcji.Separatory instrukcji tylko rozpoznane w __asm bloki są znak nowego wiersza i __asm słowa kluczowego.Ponieważ blok, zdefiniowane jako makro jest jeden wiersz logiczne, muszą być rozdzielone każda instrukcja z __asm.

Istotne są również nawiasy klamrowe.Jeżeli je pominięto, kompilator mogą zostać łatwo pomylone sprawozdaniem c lub C++, w tym samym wierszu z prawej strony wywołania makra.Bez nawias klamrowy zamykający, kompilator nie może stwierdzić, gdzie zatrzymuje zestawu kodu i jego widzi c lub C++ oświadczeń __asm blok jako instrukcje montażu.

Styl zestawu komentarze rozpoczynających się od znaku średnika (;) nadal do końca wiersza.To powoduje problemy w makrach, ponieważ kompilator ignoruje wszystko po komentarz, do końca linii logicznej.To samo dotyczy Komentarze jednowierszowe c lub C++ ( // comment).Aby uniknąć błędów, należy użyć c komentarze w starym stylu ( /* comment */) w __asm bloków określona jako makra.

__asm Blok zapisano c makra może mieć argumentów.W odróżnieniu od zwykłych c makro, jednak __asm makro nie może zwracać wartości.Aby takie makra nie można używać w wyrażeniach c lub C++.

Należy zachować ostrożność, aby nie wywołać pozbywania makra tego typu.Na przykład, wywoływanie makra języka asemblera w funkcji zadeklarowanych z __fastcall Konwencji może spowodować nieoczekiwane rezultaty.(Zobacz przy użyciu i konserwowanie rejestrów w zestawie Inline.)

KONIEC Microsoft szczególne

Zobacz też

Informacje

Asembler inline