__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:
__asm
assembly-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