Delen via


__asm

Microsoft-specifieke

Het __asm trefwoord roept de inlineassembly aan en kan worden weergegeven waar een C- of C++-instructie legaal is. Het kan niet uit zichzelf verschijnen. Het moet worden gevolgd door een montage-instructie, een groep instructies tussen accolades, of, minimaal, een leeg paar accolades. De term '__asm blok' verwijst hier naar een instructie of groep instructies, ongeacht of deze al dan niet in accolades staat.

Opmerking

Visual C++ ondersteuning voor het trefwoord Standard C++ asm is beperkt tot het feit dat de compiler geen fout op het trefwoord genereert. asm Een blok genereert echter geen zinvolle code. Gebruik __asm in plaats van asm.

Grammatica

asm-block:
__asm assembly-instructie;opt
__asm { assembly-instruction-list};optie

assembly-instruction-list:
assembly-instructie;optioneel
assembly-instructie;assembly-instructie-lijst;opt

Opmerkingen

Als er geen accolades worden gebruikt, betekent het __asm trefwoord dat de rest van de regel een assemblytaalinstructie is. Als deze wordt gebruikt met accolades, betekent dit dat elke regel tussen de accolades een assemblytaal-instructie is. Voor compatibiliteit met eerdere versies _asm is dit een synoniem voor __asm.

Omdat het __asm trefwoord een scheidingsteken voor instructies is, kunt u assembly-instructies op dezelfde regel plaatsen.

Vóór Visual Studio 2005 was de instructie als volgt:

__asm int 3

heeft niet tot gevolg dat systeemeigen code wordt gegenereerd wanneer deze wordt gecompileerd met /clr; de compiler heeft de instructie vertaald naar een CLR-onderbrekingsinstructie.

__asm int 3 resulteert nu in systeemeigen codegeneratie voor de functie. Als u wilt dat een functie een onderbrekingspunt in uw code veroorzaakt en als u wilt dat die functie is gecompileerd naar MSIL, gebruikt u __debugbreak.

Voor compatibiliteit met eerdere versies _asm is dit een synoniem voor __asm tenzij compileroptie /Za (taalextensies uitschakelen) is opgegeven.

Voorbeeld

Het volgende codefragment is een eenvoudig __asm blok tussen accolades:

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

U kunt ook voor elke assembly-instructie plaatsen __asm :

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

Omdat het __asm trefwoord een scheidingsteken voor instructies is, kunt u ook assembly-instructies op dezelfde regel plaatsen:

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

Alle drie de voorbeelden genereren dezelfde code, maar de eerste stijl (tussen het __asm blok in accolades) heeft enkele voordelen. De accolades scheiden duidelijk assemblycode van C- of C++-code en voorkomen onnodige herhaling van het __asm trefwoord. Accolades kunnen ook dubbelzinnigheden voorkomen. Als u een C- of C++-instructie op dezelfde regel als een __asm blok wilt plaatsen, moet u het blok tussen accolades plaatsen. Zonder de accolades kan de compiler niet zien waar assemblycode stopt en C- of C++-instructies beginnen. Ten slotte, omdat de tekst in accolades dezelfde indeling heeft als gewone MASM-tekst, kunt u eenvoudig tekst knippen en plakken uit bestaande MASM-bronbestanden.

In tegenstelling tot accolades in C en C++ hebben de accolades die een __asm blok omsluiten geen invloed op het bereik van variabelen. U kunt ook __asm-blokken nesten, nesten heeft geen invloed op het bereik van variabelen.

Microsoft-specifieke beëindigen

Zie ook

Zoekwoorden
Inline-assembler