__asm
Específicos de Microsoft
La palabra clave __asm
invoca el ensamblador alineado y puede aparecer siempre que una instrucción de C o C++ sea válida. No puede aparecer por sí sola. Debe ir seguida de una instrucción de ensamblado, un grupo de instrucciones entre llaves o, como mínimo, un par de llaves vacío. El término "bloque __asm
" aquí hace referencia a cualquier instrucción o grupo de instrucciones, incluido o no entre llaves.
Nota:
La compatibilidad de Visual C++ con la palabra clave asm
de C++ estándar se limita al hecho de que el compilador no generará un error en la palabra clave. Sin embargo, un bloque asm
no generará ningún código importante. Use __asm
en lugar de asm
.
Gramática
bloque-asm:
__asm
assembly-instruction ;
opt
__asm {
assembly-instruction-list }
;
opt
lista-de-instrucciones-de-ensamblado:
assembly-instruction ;
opt
assembly-instruction ;
assembly-instruction-list ;
opt
Comentarios
Si se utiliza sin llaves, la palabra clave __asm
indica que el resto de la línea es una instrucción de lenguaje de ensamblado. Si se utiliza con llaves, indica que cada línea entre las llaves es una instrucción de lenguaje de ensamblado. Por compatibilidad con versiones anteriores, _asm
es un sinónimo de __asm
.
Dado que la palabra clave __asm
es un separador de la instrucción, puede colocar las instrucciones de ensamblado en la misma línea.
Antes de Visual Studio 2005, la instrucción
__asm int 3
no hacía que se generase código nativo al compilar con /clr; el compilador convertía la instrucción en una instrucción de interrupción de CLR.
__asm int 3
ahora da lugar a la generación de código nativo para la función. Si desea que una función produzca un punto de interrupción en el código y desea que dicha función compile para MSIL, utilice __debugbreak.
A efectos de compatibilidad con versiones anteriores, _asm
es un sinónimo de __asm
, a menos que se especifique la opción del compilador /Za (Deshabilitar extensiones de lenguaje).
Ejemplo
El fragmento de código siguiente es un bloque __asm
simple incluido entre llaves:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
Como alternativa, puede colocar __asm
delante de cada instrucción de ensamblado:
__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al
Debido a que la palabra clave __asm
es un separador de la instrucción, también puede colocar las instrucciones de ensamblado en la misma línea.
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
Los tres ejemplos generan el mismo código, pero el primer estilo (incluyendo el bloque __asm
entre llaves) tiene algunas ventajas. Las llaves separan claramente el código de ensamblado del código de C o C++ y evitan la repetición innecesaria de la palabra clave __asm
. Las llaves también pueden evitar ambigüedades. Si desea colocar una instrucción de C o C++ en la misma línea que un bloque __asm
, debe incluir el bloque entre llaves. Sin las llaves, el compilador no puede indicar dónde se detiene el código de ensamblado y dónde comienzan las instrucciones de C o C++. Finalmente, como el texto entre llaves tiene el mismo formato que el texto de MASM normal, se puede cortar y pegar fácilmente el texto de los archivos de código fuente de MASM existentes.
A diferencia de las llaves en C y C++, las llaves que incluyen un bloque __asm
no afectan al ámbito de las variables. También puede anidar los bloques __asm
; el anidado no afecta al ámbito de las variables.
FIN de Específicos de Microsoft