Definición de los bloques de __asm como macros de C
Específicos de Microsoft
Las macros de C proporcionan una forma cómoda de insertar el código de ensamblado en el código fuente, pero exigen cuidado adicional como una macro expanda en una sola línea lógica.para crear macros sin problemas, siga estas reglas:
agregue __asm bloqueado en llaves.
Coloque la palabra clave de __asm delante de cada instrucción de ensamblado.
Utilice comentarios antiguos de C ( /* comment */) en lugar de comentarios ensamblado-estilo ( ; comment) o de los comentarios de una línea de C ( // comment).
Para mostrar, el ejemplo siguiente se define una macro sencilla:
#define PORTIO __asm \
/* Port output */ \
{ \
__asm mov al, 2 \
__asm mov dx, 0xD007 \
__asm out dx, al \
}
A primera vista, las tres palabras clave pasadas de __asm parecen superfluas.Son necesarios, sin embargo, dado que la macro se expande en una única línea:
__asm /* Port output */ { __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al }
La tercera y la cuarta palabras clave de __asm se necesitan como separadores de la instrucción.los únicos separadores de la instrucción reconocidos en los bloques de __asm son el carácter de nueva línea y la palabra clave de __asm .Porque un bloque definido como una macro es una línea lógica, debe separar cada instrucción con __asm.
las llaves son esenciales también.Si se omite, el compilador se puede confundir con instrucciones de c o C++ en la misma línea a la derecha de la llamada de macro.Sin la llave de cierre, el compilador no puede indicar que el código de ensamblado se detiene, y ver las instrucciones de c o C++ después de que __asm bloqueado como instrucciones de ensamblado.
los comentarios de Ensamblado-estilo que comienzan con un punto y coma (;) continúan hasta el final de la línea.Esto produce problemas en macros porque el compilador omite todo después de que el comentario, hasta el final de la línea lógica.Lo mismo se aplica a los comentarios de una línea de c o C++ ( // comment).Para evitar errores, utilice comentarios antiguos de C ( /* comment */) en los bloques de __asm definido como macros.
__asm bloquea tipo mientras la macro de C/C++. puede aceptar argumentos.A diferencia de una macro normal de C, sin embargo, una macro de __asm no puede devolver un valor.No puede utilizar tan tales macros en expresiones de c o C++.
Tenga cuidado de no llamar a macros de este tipo indistintamente.Por ejemplo, ejecutar una macro en lenguaje de ensamblado en una función declarada con la convención de __fastcall puede producir resultados inesperados.(Vea Mediante y guardando los registros de ensamblado en línea.)
Específico de Microsoft de FINAL