__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í mismo. Debe ir seguido de una instrucción de ensamblado, un grupo de instrucciones entre llaves o, como mínimo, un par vacío de llaves. 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.

Grammar

bloque-asm:
__asminstrucción-de-ensamblado;opt
__asm {lista-de-instrucciones-de-ensamblado};opt

lista-de-instrucciones-de-ensamblado:
instrucción-de-ensamblado;opt
instrucción-de-ensamblado;lista-de-instrucciones-de-ensamblado;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 generara código nativo cuando se compilaba con /clr; el compilador traducía la instrucción a una instrucción de interrupción 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 comienzan las instrucciones 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 __asm bloques; el anidamiento no afecta al ámbito de variable.

FIN de Específicos de Microsoft

Consulte también

Palabras clave
Ensamblador insertado