Condividi tramite


__asm

Sezione specifica Microsoft

La parola chiave __asm consente di richiamare l'assembler inline e può essere visualizzata ovunque un'istruzione C o C++ sia valida. Non può apparire da solo. Deve essere seguito da un'istruzione di assembly, da un gruppo di istruzioni racchiuse tra parentesi graffe o, almeno, da una coppia vuota di parentesi graffe. Il termine "__asm block" qui si riferisce a qualsiasi istruzione o gruppo di istruzioni, racchiuso o meno tra parentesi graffe.

Nota

Il supporto di Visual C++ della parola chiave asm di C++ standard è limitato al fatto che il compilatore non genererà un errore sulla parola chiave. Tuttavia, un blocco asm non genererà alcun codice significativo. Usare __asm invece di asm.

Grammatica

asm-block:
__asmassembly-instruction ;optare
__asm {assembly-instruction-list } ;optare

assembly-instruction-list:
assembly-instruction ;opt
assembly-instruction-instruction-list ;; opt

Osservazioni:

Se utilizzata senza parentesi graffe, la parola chiave __asm indica che il resto della riga è un'istruzione del linguaggio assembly. Se utilizzata con le parentesi graffe, significa che ogni riga tra parentesi graffe è un'istruzione del linguaggio assembly. Per la compatibilità con le versioni precedenti, _asm è un sinonimo di __asm.

Poiché la parola chiave __asm è un separatore di istruzione, è possibile inserire le istruzioni di assembly nella stessa riga.

Prima di Visual Studio 2005, l'istruzione

__asm int 3

non ha causato la generazione di codice nativo durante la compilazione con /clr. Il compilatore ha convertito l'istruzione in un'istruzione di interruzione CLR.

__asm int 3 determina ora la generazione del codice nativo della funzione. Se si vuole che una funzione causi un punto di interruzione nel codice e se si vuole che tale funzione venga compilata in MSIL, usare __debugbreak.

Per la compatibilità con le versioni precedenti, _asm è un sinonimo di __asm a meno che non sia specificata l'opzione del compilatore /Za (Disabilita estensioni del linguaggio).

Esempio

Il frammento di codice seguente è un blocco __asm semplice racchiuso tra parentesi graffe:

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

In alternativa, è possibile inserire __asm davanti a ogni istruzione dell'assembly:

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

Poiché la parola chiave __asm è un separatore di istruzione, è anche possibile inserire le istruzioni di assembly nella stessa riga:

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

Tutti e tre gli esempi generano lo stesso codice, ma il primo stile, che racchiude il blocco __asm tra parentesi graffe, presenta alcuni vantaggi. Le parentesi graffe separano chiaramente il codice dell'assembly dal codice C o C++ ed evitano la ripetizione inutile della parola chiave __asm. Le parentesi graffe possono anche impedire le ambiguità. Se si desidera inserire l'istruzione C o C++ sulla stessa riga come blocco __asm, è necessario racchiudere il blocco tra parentesi graffe. Senza le parentesi graffe, il compilatore non riesce a indicare dove inizia il codice assembly e iniziano le istruzioni C o C++. Infine, poiché il testo tra parentesi graffe ha lo stesso formato del testo MASM ordinario, è possibile tagliarlo e incollarlo facilmente dai file di origine MASM esistenti.

A differenza delle parentesi graffe in C e C++, le parentesi graffe che racchiudono un blocco __asm non influiscono sull'ambito della variabile. È anche possibile annidare __asm blocchi. L'annidamento non influisce sull'ambito delle variabili.

Fine sezione specifica Microsoft

Vedi anche

Parole chiave
Assembler inline