__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:
__asm
instrucció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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de