Dela via


__asm

Microsoft-specifik

Nyckelordet __asm anropar den infogade assemblern och kan visas oavsett var en C- eller C++-instruktion är laglig. Det kan inte visas på egen hand. Den måste följas av en sammansättningsinstruktion, en grupp instruktioner som omges av klammerparenteser eller minst ett tomt par klammerparenteser. Termen "__asm block" här refererar till instruktioner eller grupper med instruktioner, oavsett om de finns i klammerparenteser eller inte.

Anmärkning

Det visuella C++-stödet för nyckelordet Standard C++ asm är begränsat till att kompilatorn inte genererar något fel på nyckelordet. Ett asm-block genererar dock ingen meningsfull kod. Använd __asm i stället för asm.

Grammatik

asm-block:
__asm monteringsanvisning;välja
__asm { assembly-instruction-list};välja

assembly-instruction-list:
monteringsanvisning;välja
monteringsanvisning;assembly-instruction-list;välja

Anmärkningar

Om det används utan klammerparenteser innebär nyckelordet __asm att resten av raden är en instruktion för sammansättningsspråk. Om den används med klammerparenteser innebär det att varje rad mellan klammerparenteserna är en instruktion för sammansättningsspråk. För kompatibilitet med tidigare versioner _asm är en synonym för __asm om inte kompilatoralternativet /Za (Inaktivera språktillägg) har angetts .

Eftersom nyckelordet __asm är en instruktionsavgränsare kan du placera sammansättningsinstruktioner på samma rad.

Före Visual Studio 2005 ska instruktionen

__asm int 3

orsakade inte att intern kod genererades när den kompilerades med /clr; kompilatorn översatte instruktionen till en CLR-brytinstruktion.

__asm int 3 resulterar nu i inbyggd kodgenerering för funktionen. Om du vill att en funktion ska orsaka en brytpunkt i koden och om du vill att den funktionen ska kompileras till MSIL, bör du använda __debugbreak.

Exempel

Följande kodfragment är ett enkelt __asm block omgivet av klammerparenteser:

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

Du kan också placera __asm framför varje monteringsinstruktion:

__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al

Eftersom nyckelordet __asm är en instruktionsavgränsare kan du också placera sammansättningsinstruktioner på samma rad:

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

Alla tre exemplen genererar samma kod, men det första formatet (omsluter __asm blocket i klammerparenteser) har vissa fördelar. Klammerparenteserna separerar tydligt sammansättningskoden från C- eller C++-koden och undviker onödig upprepning av nyckelordet __asm . Klammerparenteser kan också förhindra tvetydigheter. Om du vill placera en C- eller C++-instruktion på samma rad som ett __asm block måste du omsluta blocket i klammerparenteser. Utan klammerparenteserna kan kompilatorn inte avgöra var sammansättningskoden slutar och C- eller C++-instruktioner börjar. Eftersom texten i klammerparenteser har samma format som vanlig MASM-text kan du enkelt klippa ut och klistra in text från befintliga MASM-källfiler.

Till skillnad från klammerparenteser i C och C++ påverkar klammerparenteserna som omsluter ett __asm block inte variabelomfånget. Du kan också kapsla __asm-block; kapsling påverkar inte variabelomfånget.

Avsluta Microsoft Specifik

Se även

nyckelord
Inlinjeassembler