Dela via


Definiera __asm block som C-makron

Microsoft-specifik

C-makron är ett bekvämt sätt att infoga sammansättningskod i källkoden, men de kräver extra försiktighet eftersom ett makro expanderas till en enda logisk rad. Följ dessa regler för att skapa problemfria makron:

  • Omslut blocket __asm i klammerparenteser.

  • Placera nyckelordet __asm framför varje sammansättningsinstruktion.

  • Använd C-kommentarer i gammal stil (/* comment */) i stället för kommentarer i sammansättningsformat (; comment) eller C-kommentarer med en rad (// comment).

För att illustrera definierar följande exempel ett enkelt makro:

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

Vid första anblicken verkar de tre __asm sista nyckelorden överflödiga. De behövs dock eftersom makrot expanderas till en enda rad:

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

Det tredje och fjärde __asm nyckelordet behövs som instruktionsavgränsare. De enda instruktionsavgränsare som identifieras i __asm blocken är nyradstecken och __asm nyckelordet. Eftersom ett block som definieras som ett makro är en logisk linje måste du avgränsa varje instruktion med __asm.

Klammerparenteserna är också viktiga. Om du utelämnar dem kan kompilatorn förväxlas med C- eller C++-instruktioner på samma rad till höger om makroanropet. Utan den avslutande klammerparentesen kan kompilatorn inte avgöra var sammansättningskoden stoppas och C- eller C++-instruktioner visas efter __asm blocket som sammansättningsinstruktioner.

Kommentarer i sammansättningsformat som börjar med ett semikolon (;) fortsätter till slutet av raden. Detta orsakar problem i makron eftersom kompilatorn ignorerar allt efter kommentaren, hela vägen till slutet av den logiska raden. Detsamma gäller för C- eller C++-kommentarer med en rad (// comment). Om du vill förhindra fel använder du C-kommentarer i gammal stil (/* comment */) i __asm block som definierats som makron.

Ett __asm block skrivet som ett C-makro kan ta argument. Till skillnad från ett vanligt C-makro kan ett __asm makro dock inte returnera ett värde. Så du kan inte använda sådana makron i C- eller C++-uttryck.

Var noga med att inte anropa makron av den här typen urskillningslöst. Om du till exempel anropar ett sammansättningsspråkmakro i en funktion som deklarerats __fastcall med konventionen kan det orsaka oväntade resultat. (Se Använda och bevara register i infogad sammansättning.)

Avsluta Microsoft Specifik

Se även

Inlinjeassembler